jquery重写$.ajax

(function($){
//首先备份下jquery的ajax方法
var_ajax=$.ajax;

//重写jquery的ajax方法
$.ajax=function(opt){
//备份opt中error和success方法
var fn = {
error:function(XMLHttpRequest, textStatus, errorThrown){},
success:function(data, textStatus){}
}
if(opt.error){
fn.error=opt.error;
}
if(opt.success){
fn.success=opt.success;
}

//扩展增强处理
var_opt = $.extend(opt,{
error:function(XMLHttpRequest, textStatus, errorThrown){
//错误方法增强处理
fn.error(XMLHttpRequest, textStatus, errorThrown);
},
success:function(data, textStatus){
//成功回调方法增强处理
fn.success(data, textStatus);
},
beforeSend:function(XHR){
//提交前回调方法
$(‘body’).append(“<div id=’ajaxInfo’ style=”>正在加载,请稍后…</div>”);
},
complete:function(XHR, TS){
//请求完成后回调函数 (请求成功或失败之后均调用)。
$(“#ajaxInfo”).remove();;
}
});
return _ajax(_opt);
};
})(jQuery);

Yaf框架cli模式运行

为了更好的与web区分(配置文件,argc、argv判断等等).重新创建一个入口文件是比较好的做法。

$app = new YafApplication(APP_PATH . "/conf/application.ini");
$app->getDispatcher()->dispatch(new YafRequestSimple());

这样入口文件就完成了。接下来,你需要学会yaf命令行的调用方法。来一个示例:

php cli.php request_uri="/daemon/start"

Yaf_Request_Simple的构造函数可以不接受任何参数, 在这种情况下, Yaf_Request_Simple会在命令行参数中, 寻找一个字符串参数, 如果找到, 则会把请求的request_uri置为这个字符串。
request_uri=”/daemon/start” 中的路径便是Controller的路由路径。在例子里指向/Controller/Daemon.php 中的 startAction()。

还有一种方法,通过Yaf_Application::execute(..)去实现。先看一下这个函数的定义:

public void Yaf_Application::execute ( callable $entry , string $... )
This method is typically used to run Yaf_Application in a crontab work. Make the crontab work can also use the autoloader and Bootstrap mechanism.

第一参数需要定义一个回调函数,也可以是一个类中的某个函数。示例:

$application->execute("main", $argc, $argv);
或
$application->execute(array("Class","Method"), $argc, $argv);

后面的参数为一个可变列表,值为你希望传入的参数。综上所述,我们的另外一种入口文件可以写成:

$app = new YafApplication(APP_PATH . "/conf/application.ini");
$app->execute('callback', $avg1, $avg2 , ...);

如果需要通过bootstrap去初始化。只需要和web一样改为:

$app->bootstrap()->execute('callback', $avg1, $avg2 , ...);

最优美的解决办法

// parse cli
if ($request->isCli ()) {
    global $argc, $argv;
    if ($argc > 1) {
        $module = '';
        $uri = $argv [1];
        if (preg_match ( '/^[^?]*%/i', $uri )) {
            list ( $module, $uri ) = explode ( '%', $uri, 2 );
        }
        $module = strtolower ( $module );
        $modules = Yaf_Application::app ()->getModules ();
        if (in_array ( ucfirst ( $module ), $modules )) {
            $request->setModuleName ( $module );
        }
        if (false === strpos ( $uri, '?' )) {
            $args = array ();
        } else {
            list ( $uri, $args ) = explode ( '?', $uri, 2 );
            parse_str ( $args, $args );
        }
        foreach ( $args as $k => $v ) {
            $request->setParam ( $k, $v );
        }
        $request->setRequestUri ( $uri );
        if ($request->isRouted () && ! empty ( $uri )) {
            if (false !== strpos ( $uri, '/' )) {
                list ( $controller, $action ) = explode ( '/', $uri );
                $request->setActionName ( $action );
            } else {
                $controller = $uri;
            }
            $request->setControllerName ( ucfirst ( strtolower ( $controller ) ) );
        }
    }
}

如果在插件中实现,routerStartup只需要$request->setRequestUri ( $uri ),如果是dispatchLoopStartup需要单独setControllerName和setActionName。

PHP安全相关函数,过滤非法字符标签,防止sql注入

/***安全相关函数***/
/**
 * 安全过滤类-全局变量过滤
 * 在Controller初始化的时候已经运行过该变量,对全局变量进行处理
 * 使用方法:filter()
 * @return
 */
function filter() {
    if (is_array($_SERVER)) {
        foreach ($_SERVER as $k => $v) {
            if (isset($_SERVER[$k])) {
                $_SERVER[$k] = str_replace(array('<','>','"',"'",'%3C','%3E','%22','%27','%3c','%3e'), '', $v);
            }
        }
    }
    unset($_ENV, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_ENV_VARS);
    filter_slashes($_GET);
    filter_slashes($_POST);
    filter_slashes($_COOKIE);
    filter_slashes($_FILES);
    filter_slashes($_REQUEST);
}

/**
 * 安全过滤类-加反斜杠,放置SQL注入
 * 使用方法:filter_slashes(&$value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_slashes(&$value) {
    if (get_magic_quotes_gpc()) return false; //开启魔术变量
    $value = (array) $value;
    foreach ($value as $key => $val) {
        if (is_array($val)) {
            filter_slashes($value[$key]);
        } else {
            $value[$key] = addslashes($val);
        }
    }
}

/**
 * 安全过滤类-通用数据过滤
 * 使用方法:filter_escape($value)
 * @param string $value 需要过滤的变量
 * @return string|array
 */
function filter_escape($value) {
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            $value[$k] = filter_str($v);
        }
    } else {
        $value = filter_str($value);
    }
    return $value;
}

/**
 * 安全过滤类-字符串过滤 过滤特殊有危害字符
 * 使用方法:filter_str($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_str($value) {
    $value = str_replace(array("\0","%00","\r"), '', $value);
    $value = preg_replace(array('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/','/&(?!(#[0-9]+|[a-z]+);)/is'), array('', '&amp;'), $value);
    $value = str_replace(array("%3C",'<'), '&lt;', $value);
    $value = str_replace(array("%3E",'>'), '&gt;', $value);
    $value = str_replace(array('"',"'","\t",'  '), array('&quot;','&#39;','    ','&nbsp;&nbsp;'), $value);
    return $value;
}

/**
 * 安全过滤类-过滤javascript,css,iframes,object等不安全参数 过滤级别高
 * 使用方法:filter_script($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_script($value) {
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            $value[$k] = filter_script($v);
        }
        return $value;
    } else {
        $parten = array(
            "/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dblclick|move|reset|resize|submit)/i",
            "/<script(.*?)>(.*?)<\/script>/si",
            "/<iframe(.*?)>(.*?)<\/iframe>/si",
            "/<object.+<\/object>/isU"
        );
        $replace = array("\\2", "", "", "");
        $value = preg_replace($parten, $replace, $value, -1, $count);
        if ($count > 0) {
            $value = filter_script($value);
        }
        return $value;
    }
}

/**
 * 安全过滤类-过滤HTML标签
 * 使用方法:filter_html($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_html($value) {
    if (function_exists('htmlspecialchars')) return htmlspecialchars($value);
    return str_replace(array("&", '"', "'", "<", ">"), array("&amp;", "&quot;", "&#039;", "&lt;", "&gt;"), $value);
}

/**
 * 安全过滤类-对进入的数据加下划线 防止SQL注入
 * 使用方法:filter_sql($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function filter_sql($value) {
    $sql = array("select", 'insert', "update", "delete", "\'", "\/\*",
        "\.\.\/", "\.\/", "union", "into", "load_file", "outfile");
    $sql_re = array("","","","","","","","","","","","");
    return str_replace($sql, $sql_re, $value);
}

/**
 * 私有路径安全转化
 * 使用方法:filter_dir($fileName)
 * @param string $fileName
 * @return string
 */
function filter_dir($fileName) {
    $tmpname = strtolower($fileName);
    $temp = array('://',"\0", "..");
    if (str_replace($temp, '', $tmpname) !== $tmpname) {
        return false;
    }
    return $fileName;
}

/**
 * 过滤目录
 * 使用方法:filter_path($path)
 * @param string $path
 * @return array
 */
function filter_path($path) {
    $path = str_replace(array("'",'#','=','`','$','%','&',';'), '', $path);
    return rtrim(preg_replace('/(\/){2,}|(\\\){1,}/', '/', $path), '/');
}

/**
 * 过滤PHP标签
 * 使用方法:filter_phptag($string)
 * @param string $string
 * @return string
 */
function filter_phptag($string) {
    return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $string);
}

/**
 * 安全过滤类-返回函数
 * 使用方法:str_out($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
function str_out($value) {
    $badstr = array("&", '"', "'", "<", ">", "%3C", "%3E");
    $newstr = array("&amp;", "&quot;", "&#039;", "&lt;", "&gt;", "&lt;", "&gt;");
    $value  = str_replace($newstr, $badstr, $value);
    return stripslashes($value); //下划线
}

Yii2 添加通用信息提示页面

首先定义信息提示view,/tip/index.php

<?php
$this->title = ‘提示信息’;
?>
<style>
.contentWrapper{ text-align: center; min-height: 300px; line-height: 30px;}
</style>
<div class=”contentWrapper”>
<div class=”faultTolerant notFund”>
<h4 class=”title”>提示</h4>
<p class=”content”><?=$message?></p>
<p class=”operation”><span class=”countDown”><span id=”sec”></span>秒后</span><a class=”linkHome” href=”<?=$url?>”>立即返回</a></p>
</div>
</div>
<?php $this->beginBlock(‘tipJs’) ?>
var secs = <?=$sec?>; //倒计时的秒数
var URL;
function Load(url) {
URL = url;
for (var i = secs; i >= 0; i–) {
window.setTimeout(‘doUpdate(‘ + i + ‘)’, (secs – i) * 1000);
}
}

function doUpdate(num) {
document.getElementById(“sec”).innerHTML = num ;
if (num == 0) {
window.location = URL;
}
}
$(function () {
Load(‘<?=$url?>’);
})

<?php $this->endBlock();
$this->registerJs($this->blocks[‘tipJs’], \yii\web\View::POS_END);
?>

两种方式实现此功能

第一种:采用Helper方式,如:
namespace common\helpers;

use Yii;

class TipHelper
{
/**
* 信息提示
* @param $message //提示内容
* @param string $url //跳转url,默认跳转至首页
* @param int $sec //多少秒跳转
* @return string
*/
static public function show($message, $url=”, $sec = 3)
{
$url = $url ? $url : Yii::$app->request->hostInfo;
return Yii::$app->controller->renderContent(Yii::$app->controller->renderPartial(‘/tip/index’,[‘message’=>$message, ‘url’ => $url, ‘sec’ => $sec]));
}

}

使用方法:
在控制器中调用
return common\helpers\TipHelper::show(‘提示信息内容’);

第二种:在BaseCotroller中定义通用方法
protected function tipShow($message, $url=”, $sec = 3)
{
return $this->renderContent($this->renderPartial(‘/tip/index’,[‘message’=>$message, ‘url’ => $url, ‘sec’ => $sec]));
}
在控制器中调用
return $this->tipShow(‘提示信息内容’);

 

wordpress优化,修改12处外加两个插件,让你的wordpress飞速奔跑!

  1. WordPress关闭自动更新检测
    在主题目录下的functions.php最后加入以下代码

    add_filter(‘pre_site_transient_update_core’, create_function(‘$a’, “return null;”)); // 关闭核心提示

    add_filter(‘pre_site_transient_update_plugins’, create_function(‘$a’, “return null;”)); // 关闭插件提示

    add_filter(‘pre_site_transient_update_themes’, create_function(‘$a’, “return null;”)); // 关闭主题提示

    remove_action(‘admin_init’, ‘_maybe_update_core’); // 禁止 WordPress 检查更新

    remove_action(‘admin_init’, ‘_maybe_update_plugins’); // 禁止 WordPress 更新插件

    remove_action(‘admin_init’, ‘_maybe_update_themes’); // 禁止 WordPress 更新主题

  2. 关闭自动更新
    在WordPress 根目录下的 wp-config.php 中define(‘WP_DEBUG’, false);行下添加代码

    define( ‘AUTOMATIC_UPDATER_DISABLED’, true );

  3. 关闭自动保存
    在WordPress 根目录下的 wp-config.php 中define(‘WP_DEBUG’, false);行下添加代码

    define(‘AUTOSAVE_INTERVAL’, 36000); // 10小时,设置为false会出现问题

    在主题目录下的functions.php最后加入以下代码

    wp_deregister_script(‘autosave’); //移除移动保存函数

  4. 取消自动修订版
    在WordPress 根目录下的 wp-config.php 中define(‘WP_DEBUG’, false);行下添加代码

    define(‘WP_POST_REVISIONS’,false);

    在主题目录下的functions.php最后加入以下代码

    remove_action(‘post_updated’,’wp_save_post_revision’ );

  5. 去除WORDPRESS自带的 Emoji
    在主题目录下的functions.php最后加入以下代码

    remove_action( ‘admin_print_scripts’ , ‘print_emoji_detection_script’);
    remove_action( ‘admin_print_styles’ , ‘print_emoji_styles’);
    remove_action( ‘wp_head’ , ‘print_emoji_detection_script’, 7);
    remove_action( ‘wp_print_styles’ , ‘print_emoji_styles’);
    remove_filter( ‘the_content_feed’ , ‘wp_staticize_emoji’);
    remove_filter( ‘comment_text_rss’ , ‘wp_staticize_emoji’);
    remove_filter( ‘wp_mail’ , ‘wp_staticize_emoji_for_email’);
    add_filter( ’emoji_svg_url’, create_function( ”, ‘return false;’ ) );//禁用emoji预解析

  6. 去除 XMLRPC, WLW, Generator, Feeds 和 ShortLink
    在主题目录下的functions.php最后加入以下代码

    remove_action(‘wp_head’, ‘rsd_link’); //removes EditURI/RSD (Really Simple Discovery) link.
    remove_action(‘wp_head’, ‘wlwmanifest_link’); //removes wlwmanifest (Windows Live Writer) link.
    remove_action(‘wp_head’, ‘wp_generator’); //removes meta name generator.
    remove_action(‘wp_head’, ‘wp_shortlink_wp_head’); //removes shortlink.
    remove_action( ‘wp_head’, ‘feed_links’, 2 ); //removes feed links.
    remove_action(‘wp_head’, ‘feed_links_extra’, 3 ); //removes comments feed.

  7. 去除和日志相关的 Link
    在主题目录下的functions.php最后加入以下代码

    remove_action(‘wp_head’, ‘parent_post_rel_link’, 10, 0 );//清除前后文信息
    remove_action(‘wp_head’, ‘start_post_rel_link’);
    remove_action(‘wp_head’, ‘index_rel_link’);
    remove_action(‘wp_head’, ‘adjacent_posts_rel_link’);

  8. 去除 Previous 和 Next 文章链接
    在主题目录下的functions.php最后加入以下代码

    remove_action(‘wp_head’, ‘adjacent_posts_rel_link_wp_head’);

  9. 禁用REST API功能代码
    在主题目录下的functions.php最后加入以下代码

    add_filter(‘rest_enabled’, ‘__return_false’);
    add_filter(‘rest_jsonp_enabled’, ‘__return_false’);

  10. 移除wp-json链接的代码
    在主题目录下的functions.php最后加入以下代码

    remove_action( ‘wp_head’, ‘rest_output_link_wp_head’, 10 );
    remove_action( ‘wp_head’, ‘wp_oembed_add_discovery_links’, 10 );

  11. 移除某些WP自带的小工具(根据自身情况调整)
    在主题目录下的functions.php最后加入以下代码

    function coolwp_remove_meta_widget()
    {

    unregister_widget(‘WP_Widget_Pages’);
    unregister_widget(‘WP_Widget_Calendar’);
    //unregister_widget(‘WP_Widget_Archives’);
    unregister_widget(‘WP_Widget_Links’);
    unregister_widget(‘WP_Widget_Meta’);
    //unregister_widget(‘WP_Widget_Search’);
    unregister_widget(‘WP_Widget_Text’);
    //unregister_widget(‘WP_Widget_Categories’);
    //unregister_widget(‘WP_Widget_Recent_Posts’);
    unregister_widget(‘WP_Widget_Recent_Comments’);
    unregister_widget(‘WP_Widget_RSS’);
    unregister_widget(‘WP_Widget_Tag_Cloud’);
    //unregister_widget(‘WP_Nav_Menu_Widget’);
    //register_widget(‘WP_Widget_Meta_Mod’);

    }
    add_action( ‘widgets_init’, ‘coolwp_remove_meta_widget’,11 );

  12. 移除WP为仪表盘(dashboard)页面加载的小工具
    在主题目录下的functions.php最后加入以下代码

    function cwp_remove_dashboard_widgets()
    {

    global $wp_meta_boxes,$wp_widget_factory;
    remove_action(‘wp_head’, array($wp_widget_factory->widgets[‘WP_Widget_Recent_Comments’] ,’recent_comments_style’));
    unset($wp_meta_boxes[‘dashboard’][‘side’][‘core’][‘dashboard_quick_press’]);
    unset($wp_meta_boxes[‘dashboard’][‘normal’][‘core’][‘dashboard_incoming_links’]);
    unset($wp_meta_boxes[‘dashboard’][‘normal’][‘core’][‘dashboard_right_now’]);
    unset($wp_meta_boxes[‘dashboard’][‘normal’][‘core’][‘dashboard_plugins’]);
    unset($wp_meta_boxes[‘dashboard’][‘normal’][‘core’][‘dashboard_recent_drafts’]);
    unset($wp_meta_boxes[‘dashboard’][‘normal’][‘core’][‘dashboard_recent_comments’]);
    unset($wp_meta_boxes[‘dashboard’][‘side’][‘core’][‘dashboard_primary’]);
    unset($wp_meta_boxes[‘dashboard’][‘side’][‘core’][‘dashboard_secondary’]);

    }
    add_action(‘wp_dashboard_setup’, ‘cwp_remove_dashboard_widgets’,11 );

    另外安装WP Super Cache插件和Disable Google Fonts插件