Products
GG网络技术分享 2025-03-18 16:05 9
Wordpress的定时任务功能我们经常用到,例如Wordpress的定时备份、定时发布文章等,在Wordpress中是靠wp-cron.php来实现这些功能的。用wordpress,离不开各种插件,但许多插件都会为自身性能而去添加一些wp-cron定时任务,当我们卸载插件后,这些定时任务并不会被完整移除,会有一些残留。久而久之,wordpress就会经常运行一些没有实际意义的定时任务,造成资源占用较高的情况。如果后台有很多的这种定时任务,就很容易出现cpu占用超标而宕机的情况。
原来,在使用了wp-super-cache缓存插件的时候,后台会有很多wp-cron.php的调用,每一次访问页面都会调用,这样就容易出现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,加入一行:
注意:在第30-40行加入,否则可能不生效。
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
或者用宝塔的计划任务添加
根据第三方监控服务的设置,每隔一定的时间就运行一下wp-cron.php,这样就又可以进行定时发布文章了。
Demand feedback