博客频频宕机的罪魁祸首:wp-cron.php
前段时间我的博客频频宕机,查了服务器的日志后发现总有人在偷偷扫描我的后台并不断尝试登陆,于是我采取了修改WordPress后台登录地址的措施,修改后博客宕机现象大大减少,但还是偶尔会宕机。有一次我登陆阿里云的控制台,恰好遇到cpu占用达到100%的情况,接着不一会儿就宕机了。这下知道了宕机的直接原因和精确的宕机时间,再查服务器日志,很快就发现宕机是由于wp-cron.php引起的。
搜索一下,发现这个wp-cron.php是用来实现wordpress的定时任务的。比如wordpress的定时备份、定时发布文章等都需要用到定时任务功能,这个功能是靠wp-cron.php来实现的。用wordpress,离不开各种插件,但许多插件都会为自身性能而去添加一些wp-cron定时任务,当我们卸载插件后,这些定时任务并不会被完整移除,会有一些残留。久而久之,wordpress就会经常运行一些没有实际意义的定时任务,造成资源占用较高的情况。如果后台有很多的这种定时任务,鉴于阿里云虚拟主机的孱弱配置,就很容易出现cpu占用超标而宕机的情况。
知道了原因,解决起来就方便了。首选方式是移除这些无效的wp-cron定时任务,来优化wordpress的性能。在当前主题的function.php文件里面添加如下代码:
//移除无效的wp-cron定时任务
add_action('wpjam_remove_invild_crons', 'wpjam_remove_invild_crons');
function wpjam_remove_invild_crons(){
global $wp_filter;
$wp_crons = _get_cron_array();
foreach ($wp_crons as $timestamp => $wp_cron) {
foreach ($wp_cron as $hook => $dings) {
if(emptyempty($wp_filter[$hook])){
foreach( $dings as $sig=>$data ) {
wp_unschedule_event($timestamp, $hook, $data['args']);
}
}
}
}
}
if(!wp_next_scheduled('wpjam_remove_invild_crons')) {
wp_schedule_event( time(), 'daily', 'wpjam_remove_invild_crons' );
}
如果移除无效任务还不行,也可以干脆来个釜底抽薪,禁用定时任务,编辑wp-config.php,加入一行:
// ** 禁用定时任务 ** //
define('DISABLE_WP_CRON', true);
这样就把定时任务功能给禁用掉了,但同时数据库定时备份、定时发表文章等功能也不能用了。如果确需要以上功能,可通过服务器crontab设置定时访问wp-cron.php来执行定时任务,在后台系统的crontab文件里,增加如下的代码:
*/15 * * * * YOUR_USER /usr/bin/wget -q --post-data '' http://your_site/wp-cron.php?doing_wp_cron -O /dev/null
即每15分钟,调用wget命令访问站点的wp-cron.php文件,post-data参数指示wget用POST方法,而不是GET方法,这样可以避免缓存插件影响后台任务的正确执行,但post-data传输的数据必须是空内容,否则wp-cron.php会拒绝执行。
或者在系统的crontab中添加如下代码:
0,30 * * * * php -q /path_to_your_site/public_html/wp-cron.php
但是我用的是虚拟主机,是没有方法修改crontab的,上面的代码是不是有效也不好确定,大家可以自己试一试。但虚拟主机是不是就不能定时执行wp-cron.php了呢?并不是,还可以使用第三方提供的监控服务来“曲线救国”,比如DNSPOD的“D监控”,在“URL监控”里添加如下网址即可:
http://your_site/wp-cron.php?doing_wp_cron
根据第三方监控服务的设置,每隔一定的时间就运行一下wp-cron.php,这样就又可以进行定时发布文章了。
作者:http://www.gaohaipeng.com/4031.html
:D 少女祈祷中...
wp还有这个功能啊~