如何确保一次只运行一个wp_cron()?

时间:2018-07-17 作者:I am the Most Stupid Person

我大约有20个wp_cron() 类似以下代码的函数。几乎所有cron每小时运行一次;一些是每天的。

if ( ! wp_next_scheduled( \'my_task_hook\' ) ) {
  wp_schedule_event( time(), \'hourly\', \'my_task_hook\' );
}

add_action( \'my_task_hook\', \'my_task_function\' );

function my_task_function() {
  //Complex Code
}
为了提高服务器性能,并避免不断从托管公司获取服务器限制消息,我想确保在给定的时间内只运行一个cron。。。有可能吗?

<小时>The current accepted answer is great, but I have following question, that\'s why I start a bounty for this question.

请先阅读已接受的答案。

假设Cron 1运行,我的cron2代码不会运行,因为我们仍然在5分钟内,或者第一个Cron仍在运行,但是因为wp_schedule_event( time(), \'hourly\', \'my_task_hook\' ); 运行cron2我想WordPress会将其视为cron2运行。。。。。所以基本上cron2代码的代码永远不会运行。。。。。还是我误解了什么?

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

是的,有可能。。。

老实说,这通常是非常重要的。。。当cron任务很长时,WP调度程序有时会导致问题。。。

那么我如何解决这个问题呢

我使用Transients API 要实现信号量。。。

代码如下:

if ( ! wp_next_scheduled( \'my_task_hook\' ) ) {
  wp_schedule_event( time(), \'hourly\', \'my_task_hook\' );
}

add_action( \'my_task_hook\', \'my_task_function\' );

function my_task_function() {
  // if some other my_task is already running, stop
  if ( get_transient( \'my_task_function_semaphore\' ) ) return;

  // set semaphore for 5 minutes
  set_transient( \'my_task_function_semaphore\', true, 5*60 );

  // DO YOUR STUFF

  delete_transient( \'my_task_function_semaphore\' );
}
在这种情况下,为什么要使用瞬态?因为:

它们是WP的一部分所以让我们假设有许多不同的cron任务,它们不应该同时运行,但我们仍然希望它们都运行。。。

如果我们将解决方案与信号量一起使用,并且对所有这些任务只使用一个信号量,那么其中一些任务可能永远不会运行。那么该怎么办呢?

在这种情况下,你应该改变你的想法。您没有一些独立的任务,但有一个任务队列要执行。因此,您应该以这种方式实现它。

因此:

添加某种队列(可以使用数组并将其存储为选项,也可以添加自定义DB表)

结束

相关推荐

Xmlrpc.php返回405响应代码

我希望有人能帮上忙。一周前,我们在主页上的排名大幅下降。当我转到谷歌搜索控制台时,在删除前2天报告了一个新错误。第一个是xmlrpc。php返回405错误和wp admin/admin ajax。php返回400错误。我现在正在考虑修复错误,但我在另一个网站上看到的一个建议是用新下载的wordpress中的xmlrpc替换xmlrpc。我的问题是,这会把网站搞砸吗?如果您有任何关于避免其他错误的建议,我们也将不胜感激。谢谢这一切似乎都是在插件更新(工具集类型)时发生的,但网站是用它构建的,因此我无法禁用该