文章目录[隐藏]
在 WordPress 中可以定义定时作业,指定定时去执行,那么这些定时作业是存在在哪里呢,怎么运行的呢?接下来我们就讲讲如何使用 Memcached 内存缓存优化 WordPress 定时作业功能,使其降低写入从而降低整体资源占用。如果你还不清楚什么是 Memcached 内存缓存,那么建议你先阅读《使用 Memcached 内存缓存给 WordPress 网站提速并降低负载》。

WordPress定时作业介绍
WordPress 的定时作业存储在 options 表里面,它使用的是 cron 这个 option。
那么定时作业在每次执行过程中,WordPress 使用方法 get_option('cron') 获取当前的定时作业配置,然后更新当前作业的下次执行时间和参数等通过 update_option('cron', $value) 写回 option 表。
这样每次定时作业的执行,都会对 option 进行写操作,如果系统的定时作业多的话,option 表会不停的被刷新,这样会影响系统的效率,我们可以把定时作业的配置存到内存里面,通过内存缓存去优化这个定时作业的执行过程。
优化WordPress定时作业
接下来我们就使用 Memcached 内存缓存优化 WordPress 定时作业功能。
首先判断内存中是否有定时作业的配置,如有则使用内存中的配置:
add_filter('pre_option_cron', function($pre){
$value = get_transient('wpexp_crons');
return $value ?: $pre;
});
每次更新定时作业配置,都先写入内存。那么什么时候,将定时作业的配置写回数据库呢?
我们在内存中设置一个标记,这个标记存活期1小时,当他失效的时候,我们就将定时作业的配置写回数据库的 option 表,所以每小时都会将定时作业的配置写回数据库:
add_filter('pre_update_option_cron', function($value, $old_value){
if($value === $old_value || maybe_serialize($value) === maybe_serialize($old_value)){
return $value;
}
set_transient('wpexp_crons', $value, HOUR_IN_SECONDS);
if(get_transient('wpexp_cron_mark') === false){
set_transient('wpexp_cron_mark', 1, HOUR_IN_SECONDS);
return $value;
}else{
return $old_value;
}
}, 10, 2);