如果第一次运行wp-cron.php花费的时间太长,运行两次是否安全?

时间:2013-04-13 作者:PJ Brunet

假设我在WP配置中禁用了“DISABLE\\u WP\\u CRON”。php

可以运行wp cron吗。php两次重叠?

我有时注意到wp cron。php需要几分钟。我会花整整一个小时,但我的博主整天都在做很多安排,她很忙。

比如说我每10分钟用一个真正的crontab运行一次

*/10***等。

它需要整整15分钟的时间来做生意。15分钟只是一个随机的例子。这花了多长时间,似乎没有任何押韵或理由。

可以创建两个wp cron“实例”。php一起安全运行?最旧的实例是否已死亡,而新实例是否已接管?从运行wp-cron的bash脚本可以看出。php,当新实例启动时,第一个实例失败。

示例:cron启动wp cron。晚上11:01,菲律宾。

php /home/www-data/example.com/wp-cron.php && echo "wp-cron.php done" | mailx [email protected]

11: 21点wp cron。php再次启动(*/20),但我仍然没有收到“完成”的电子邮件。但这一次,在随后的wp cron出现17秒后,我收到了“完成”的电子邮件。php运行。

(不确定wp-cron.php是否自行失败,或者wp-cron.php是否在运行2x后自杀。)

所以我想知道:第一个实例的数据丢失了吗?在我看来,一个运行了10分钟的进程突然失败是“糟糕的”。此时,我很想停止使用crontab,回到wp-config默认行为,因为这比我预想的要麻烦得多。

这听起来也不太令人放心:How is WP Cron Locking implemented?

如果在第一个进程死亡之前没有删除“瞬态”会怎么样?那么,未完成的任务是否永远未完成?什么是瞬态?我想这是某种旗帜。

我今天遇到了很大的问题。服务器速度变慢,触发了一些超时,我认为这是导致wp cron的原因。php失败,导致两次发帖,预定的帖子没有发帖,真是一场噩梦!

更新:正在尝试调用wp cron。使用crontab操作系统的php对我和客户机来说都是巨大的时间浪费。在我这边,wp cron。php似乎执行得很好,在不同的持续时间内使用了内存和CPU时间,但根据我的客户机,预定的帖子从未发布过。如果有一个“详细”模式来指示它实际上在做什么,那就太好了。我没有时间调查这件事,于是走了另一条路。我只是努力提高服务器的速度,以某种方式解决了这个问题。(我的猜测是,由于服务器过载,导致出现了一些超时。)我希望在升级服务器之前,可以让crontab快速工作。但我越是关注wp cron。php,我越不信任它。计划失败、双重发布、如何执行建议冲突。这就是我来这里的原因。我自己的一个网站也有一个类似的脚本,每小时运行一次——它的设计不是为了重叠,但如果重叠,在合理的参数范围内,它是相当安全的。再说一次,我知道什么对我来说是合理的。我不知道什么对wp cron的作者来说是合理的。php。

所以这对我来说是一个分心和死胡同。我更改了wp配置。php返回默认设置(删除DISABLE\\u WP\\u CRON),并让WordPress处理WP CRON。php。现在有了更快的服务器,WordPress可以很好地再次安排帖子。坚持默认值总是更安全的。

更多故事详情如下:http://tomakefast.com/when-wp-cron-php-sceduling-fails-3003/

1 个回复
最合适的回答,由SO网友:Alexander Garden 整理而成

如何wp cron。php的行为取决于您如何执行它。如果通过HTTP请求在GET字符串中使用“do\\u wp\\u cron”执行它,它将检查另一个wp cron进程是否设置了锁,如果设置了,则退出。默认情况下,这是WordPress执行它的方式。在crontab中很容易做到这一点,如下所示:

*/10 * * * * /usr/bin/wget -q -O "http://www.example.com/wp-cron.php?doing_wp_cron=`date +\\%s.\\%N`" > /dev/null 2>&1
但是,如果您像现在这样直接使用PHP cli执行它,那么情况就不同了。然后检查WP\\u CRON\\u LOCK\\u TIMEOUT,默认设置为60秒。如果现有进程已运行的时间超过该时间,它将为自己申请锁,并从一开始就继续运行计划作业。

这并不是一场灾难,因为wp-cron会在运行过程中重新安排和不安排作业。就在它运行作业之前,它会取消计划。这样可以防止作业运行两次[1]。在它完成一个作业后,它会检查以确保它仍然拥有锁。如果没有,则退出。这就是为什么第一个进程在启动第二个进程后不久就退出了。

因此,在您的情况下,您有一组计划的作业,有时需要20多分钟才能运行。每10分钟队列中可能有一些作业占用了所有时间。wp cron启动并持续20分钟。然后启动另一个实例。第二个实例发现锁的超时时间早于第六十秒,并为自己声明锁。然后从头开始。第一个进程在运行过程中执行了未计划和重新计划的作业,但如果作业位于每10分钟一次的队列中,则现在可以再次运行它们了。因此,第二个过程会重新开始。第一个到达它所从事的工作的末尾,看到它不再拥有锁,就退出了。而且,由于预定的帖子位于队列的末尾,因此它们永远不会被发布。

此外,由于wp-cron在运行作业之前会对作业进行非计划化,如果在运行作业和作业完成之间由于内存耗尽或其他原因而死亡,作业将丢失。

大多数时候。有一个比赛条件。如果另一个进程在第一个进程检查锁之后和该进程取消计划下一个作业之前都声明锁,则该作业将运行两次。在陷入困境的服务器上,出现这种情况的可能性可能更大

结束

相关推荐

如何修复wp-cron中缺失的功能?

我的一个网站一直未能发布预定的帖子。我尝试过禁用插件,使用了212等,但没有成功。我安装了核心控制插件,并注意到没有与publish\\u future\\u post挂钩相关的功能。在我的其他网站上,有一个钩住的函数check\\u and\\u publish\\u future\\u post(),但在这个特定的网站上没有。我的问题是(1)这到底是怎么发生的,(2)我该如何修复它?我已经尝试了Wordpress的干净安装(wp内容除外),没有任何更改。在没有指导的情况下,我已经达到了极限,所以我希望