我正在大量帖子上使用wp\\u query对自定义字段数据进行一些计算,加载结果需要很长时间。这里的一位用户建议我利用wp cron每天运行一次这些计算。
我一直无法理解的是,如果我创建一个包含所有这些代码的操作,将其设置为每天运行一次,并在模板文件中调用此操作,那么这些查询不会在每次加载模板时重新计算吗?
我的预期结果是查询结果显示在模板上,但实际上只有在cron启动时才重新计算。
我觉得这里缺少了一些简单的东西,但我能找到的所有wp cron示例似乎都没有涵盖我的用例。
我正在大量帖子上使用wp\\u query对自定义字段数据进行一些计算,加载结果需要很长时间。这里的一位用户建议我利用wp cron每天运行一次这些计算。
我一直无法理解的是,如果我创建一个包含所有这些代码的操作,将其设置为每天运行一次,并在模板文件中调用此操作,那么这些查询不会在每次加载模板时重新计算吗?
我的预期结果是查询结果显示在模板上,但实际上只有在cron启动时才重新计算。
我觉得这里缺少了一些简单的东西,但我能找到的所有wp cron示例似乎都没有涵盖我的用例。
我正在使用transients 对于这种情况。结果保存到数据库(wp_options
表)设置了过期时间。如果慢加载时间低于某个合理的阈值,它是可用的。。。一个(第一个)访问者需要等待很长时间才能提交请求,其他访问者将看到保存的结果。
$results = get_transient(\'my_results\');
if( ! $results ) {
$results = my_intensive_calculations(); // etc...
set_transient( \'my_results\' , $results, DAY_IN_SECONDS );
}
echo $results;
crons有一个缺点-第一个访问者必须等待my_intensive_calculations()
响应(cron请求在后台运行,不阻止页面呈现)。但它的结果将被缓存,其他所有访问者都将尽快看到页面/模板。假设您的代码存在于函数中calculateCityAverages()
返回(不是echo!)您的数据,可能以数组的形式。
要缓存数据,你可以做很多事情,自定义选项,甚至一篇帖子。。我会使用Transients API
Transients API,它提供了一种简单而标准化的方法,通过为缓存数据提供一个自定义名称和一个时间段,在该时间段之后缓存数据将过期并被删除,从而将缓存数据临时存储在数据库中。
将计算函数包装成这样
function getCityAverages($force = FALSE){
$result = get_transient(\'my_city_averages\');
// if there is no cached data or we want to refresh cache
if ($result === FALSE || $force === TRUE) {
// calculate it
$result = calculateCityAverages();
// store it for 12h
set_transient(\'my_city_averages\', $result, 12 * HOUR_IN_SECONDS);
}
return $result;
}
但仍然存在一个问题:对于第一个访问者,或者缓存为空的任何时候,都会有40秒的页面加载。只有在那之后的游客才会从这一过渡中获益。要避免这种情况,可以加热缓存(cold and warm cache?), 因为这应该在特定的时间间隔和后台进行,所以使用WP-Cron 通过wp_schedule_event()
.
建议在激活插件时安排事件,因为这通常只应执行一次(当然,计划将运行多次)。
此代码直接来自codex。你只需要打电话getCityAverages(TRUE)
(以确保您重新计算它,而不仅仅是从缓存中获取它)。
register_activation_hook(__FILE__, \'my_activation\');
function my_activation() {
if (! wp_next_scheduled ( \'my_hourly_event\' )) {
wp_schedule_event(time(), \'hourly\', \'my_hourly_event\');
}
}
add_action(\'my_hourly_event\', \'do_this_hourly\');
function do_this_hourly() {
// we don\'t care about the result, just warm cache
getCityAverages(TRUE);
}
由于您现在在WP Cron中有需要很长时间的任务,我建议使用适当的crontab/cronjob instead of how WordPress does it by default.剩下的就是电话getCityAverages()
任何需要数据的地方。
我有一个php脚本,它执行一个函数并创建一个包含结果的xml文件。我希望这个脚本每天只运行一次,我正在使用wordpress cron来实现这一点。问题是这个脚本总是在所有页面加载时运行,这很糟糕,因为它需要超过30秒才能完成。如何停止它始终运行并使其仅与wp cron一起工作?我读过关于cronjob的文章,但我的主机没有这个功能。这是我在php文件顶部使用的代码: add_action( \'my_cron_hook\', \'myfunction\' ); if( !wp_next