插件中的多个wp_Schedule_Event cron作业导致多次执行

时间:2015-10-13 作者:Entrit

上周,我一直在为一家房地产网站做一些cron工作,该网站每天都有数百条更新/删除和新增帖子。我现在已经快结束了,希望安排三场WordPress活动来处理这个过程。

我在下面链接的代码运行并向我发送一封包含输出的电子邮件(第二个和第三个事件被注释掉)。当我删除作业2和3中的注释时,问题就出现了。插件可以很好地激活,但当作业开始运行时,我会收到很多重复的电子邮件。

注**这是一个流量很大的网站,在活动安排期间可能会被多次点击。我正在阅读的一些文章提到,wp cron在处理长脚本时存在一些已知问题,可能会重叠。

尽管如此,我想知道我的cron作业是否太大,wp cron功能无法处理。这是否会迫使我在WP配置中禁用\\u WP\\u CRON。php并使用我的主机提供的cron调度器?或者我的问题是如何创建插件?

提前感谢!

register_activation_hook(__FILE__,\'cron_activation\');
register_deactivation_hook(__FILE__,\'cron_deactivation\');

function cron_activation(){  
  wp_schedule_event(time()+60, \'daily\', \'first_hook\');
  //wp_schedule_event(time()+420, \'hourly\', \'second_hook\');
  //wp_schedule_event(time()+840, \'hourly\', \'third_hook\');
}

function cron_deactivation(){  
  wp_clear_scheduled_hook(\'first_hook\');
  //wp_clear_scheduled_hook(\'second_hook\');
  //wp_clear_scheduled_hook(\'third_hook\');
}


add_action( \'first_hook\', \'first_hook_function\' );
//add_action( \'second_hook\', \'second_hook_function\' );
//add_action( \'third_hook\', \'third_hook_function\' );

function first_hook_function(){ 
  //code to run takes 2 minutes.
  //sends output as email to me for inspection
}

function second_hook_function(){
  //code to run takes 3 minutes.
  //sends output as email to me for inspection
}

function third_hook_function(){
  //code to run takes 4 minutes.
  //sends output as email to me for inspection
} 
另外,我希望我遵循了所有正确的格式,这是我的第一篇帖子!

编辑:为了澄清我的问题,是否可以使用wp cron方法从同一个插件运行这些(2到4分钟)函数?

2 个回复
SO网友:Kirill

可能是因为您没有检查挂钩是否已经安排好,所以出现了问题。

if ( !wp_next_scheduled( \'first_hook\' ) ) {
    wp_schedule_event(time()+60, \'daily\', \'first_hook\');
}

SO网友:futuernorn

通常使用Alternative Cron 更可靠。我试图以您的示例代码为基础制作一个演示,以复制所看到的内容:

<?php
/*
* Plugin Name: Overlapping Cron Test
* Author: futuernorn
*/

register_activation_hook(__FILE__,\'cron_activation\');
register_deactivation_hook(__FILE__,\'cron_deactivation\');

function cron_activation(){
  wp_schedule_event(time()+30, \'daily\', \'first_hook\');
  wp_schedule_event(time()+60, \'hourly\', \'second_hook\');
  wp_schedule_event(time()+90, \'hourly\', \'third_hook\');
}

function cron_deactivation(){
  wp_clear_scheduled_hook(\'first_hook\');
  wp_clear_scheduled_hook(\'second_hook\');
  wp_clear_scheduled_hook(\'third_hook\');
}


add_action( \'first_hook\', \'first_hook_function\' );
add_action( \'second_hook\', \'second_hook_function\' );
add_action( \'third_hook\', \'third_hook_function\' );

function first_hook_function(){
  //code to run takes 2 minutes.
  //sends output as email to me for inspection
  sleep(30);
  $crontest_data = get_option( \'_crontest_data\' );
  $crontest_data[] = \'first_hook_completed: \'.date(\'Y-m-d H:i:s\');
  update_option(\'_crontest_data\', $crontest_data);
}

function second_hook_function(){
  //code to run takes 3 minutes.
  //sends output as email to me for inspection\\
  sleep(60);
  $crontest_data = get_option( \'_crontest_data\' );
  $crontest_data[] = \'second_hook_completed: \'.date(\'Y-m-d H:i:s\');
  update_option(\'_crontest_data\', $crontest_data);
}

function third_hook_function(){
  //code to run takes 4 minutes.
  //sends output as email to me for inspection
  sleep(90);
  $crontest_data = get_option( \'_crontest_data\' );
  $crontest_data[] = \'third_hook_completed: \'.date(\'Y-m-d H:i:s\');
  update_option(\'_crontest_data\', $crontest_data);
}
有了正常的wp cron功能和一组人为的并发流量,我们可以看到每个cron只有一个条目,尽管如此:

testsite$ wp plugin activate crontest
Success: Plugin \'crontest\' activated.
testsite$ for i in {1..10}; do curl -b -s $WEBSITE_URL 1>/dev/null; done
testsite$ for i in {1..10}; do curl -s $WEBSITE_URL 1>/dev/null; done
testsite$ wp option get _crontest_data
array (
  0 => \'first_hook_completed: 2015-11-09 19:49:25\',
  1 => \'second_hook_completed: 2015-11-09 19:50:25\',
  2 => \'third_hook_completed: 2015-11-09 19:51:55\',
)
由于我无法完全复制您所看到的内容,因此这里提供更多信息可能会有所帮助。

相关推荐

无法在WordPress中通过PHP显示图像

我有一个奇怪的问题,当我尝试使用PHP输入图像标记的源代码时,它会在检查器中显示以下错误<img src=(unknown) alt=\"\"> 这个代码片段为我提供了正确的url,通过查看CPanel并粘贴和复制地址进行检查,但当我尝试通过php输入它时,不会显示图像$image = wp_get_attachment_image_src( $post_thumbnail_id); //echo($image[0]); ?> <img src=