在 WordPress 中可以定义定时作业,指定定时去执行,那么这些定时作业是存在在哪里呢,怎么运行的呢?
WordPress 定时作业的存储过程
WordPress 的定时作业存储在 options 表里面,它使用的是 cron 这个 option。
那么定时作业在每次执行过程中,WordPress 使用方法 get_option('cron')
获取当前的定时作业配置,然后更新当前作业的下次执行时间和参数等通过 update_option('cron', $value)
写回 option 表。
这样每次定时作业的执行,都会对 option 进行写操作,如果系统的定时作业多的话,option 表会不停的被刷新,这样会影响系统的效率,我们可以把定时作业的配置存到内存里面,通过内存缓存去优化这个定时作业的执行过程。
使用内存缓存优化 WordPress 定时作业功能
首先判断内存中是否有定时作业的配置,如果,则使用内存中的配置:
代码语言:javascript复制add_filter('pre_option_cron', function($pre){
$value = get_transient('wpjam_crons');
return $value ?: $pre;
});
每次更新定时作业配置,都先写入内存,那么什么时候,将定时作业的配置写回数据库呢?我们在内存中设置一个标记,这个标记存活期1小时,当他失效的时候,我们就将定时作业的配置写回数据库的 option 表,所以每小时都会将定时作业的配置写回数据库:
代码语言:javascript复制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('wpjam_crons', $value, HOUR_IN_SECONDS);
if(get_transient('wpjam_cron_mark') === false){
set_transient('wpjam_cron_mark', 1, HOUR_IN_SECONDS);
return $value;
}else{
return $old_value;
}
}, 10, 2);
WPJAM Basic 插件已经集成了 Memcached,下载 WPJAM Basic 之后,将 wpjam-basic/template/
目录下的 object-cache.php
文件复制到 wp-content
目录下即可。