Wordpress cron wp_schedule_single_event–操作并不总是有效



我正在注册一个事件,如:

wp_schedule_single_event( time(), 'do_custom_hook', array( $body ) );

除此之外,我添加了以下操作:

add_action('do_custom_hook', 'process_custom_hook', 10);
function process_custom_hook($body){
// custom code here
}

然而,有时process_custom_hook函数会触发,而其他时候则不会(不过,它大多数时候都会触发。大约有10%-20%的时间会错过)

事件总是返回true,这意味着它必须已注册。

此外,在测试时,我确保论点(正文)总是不同的。

为什么会发生这种情况?

来自编码:

请注意,除非将$args的唯一值传递给每个计划的事件,否则将忽略将事件安排在同名现有事件发生后10分钟之前。

如果您的自定义钩子只在一段时间内工作,那么这可能是一个值得关注的途径。如果您需要立即处理钩子,那么明智的做法可能是为钩子指定一个唯一的名称,或者向钩子传递唯一的值。

如果不需要立即执行作业,则可以考虑使用wp_next_scheduled()来确定作业下一次运行的时间,并将作业设置为在下一个计划作业之后运行。

同样值得注意的是,如果这个任务背后似乎有一致的逻辑(事实似乎如此),为什么不将作业信息存储到数据库中,并每5-10分钟运行一次cron作业,从数据库中提取任何新作业并按原样处理它们呢?这将避免需要处理wp_schedule_single_event()的行为。

根据该实例的官方文档,

除非为每个计划的事件传递唯一的$args值,否则将忽略使用相同操作挂钩在现有事件后10分钟内安排事件。你已经说过你做了,但也许双重检查会有所帮助。

它取决于用户访问网站的时间,因此如果计划的时间已经过去,当有人访问你的WordPress网站时,该操作将触发。

文档还指出,可以使用wp_next_scheduled()来防止重复事件,并使用wp_schedule_event()来安排重复事件。

在某些运行但被忽略的情况下,计划可能会返回true。所以它确实运行了,但被忽略了。

我建议你详细记录发送和接收的所有信息,这样你就可以自己看看发生的事情是否与你所相信的相同。

这里有一些类似问题和文档的链接,你可以看看。

我希望这能有所帮助。如果没有,让我们一起解决。

  • https://developer.wordpress.org/reference/functions/wp_schedule_single_event/
  • https://wordpress.stackexchange.com/questions/15475/using-wp-schedule-single-event-with-arguments-to-send-email
  • https://rudrastyh.com/wordpress/wp_schedule_single_event.html
  • http://hookr.io/functions/wp_schedule_single_event/

来自Wordpress文档:

WP Cron通过在每次页面加载时检查计划任务,以查看需要运行的内容。将调用任何要运行的任务在页面加载期间。

WP Cron不像系统Cron那样持续运行;它只是页面加载时触发。

如果您进行日程安排,可能会发生日程安排错误下午2:00的任务,并且直到下午5:00才发生页面加载。

我认为可能会错过您的cron事件,因为在计划时间内没有发生页面加载。

以下是解决您问题的方法:将WP Cron连接到系统任务调度器

如前所述,WP Cron不是连续运行的,这可以如果存在必须按时运行的关键任务,则是一个问题。那里是一个简单的解决方案。只需设置系统的任务调度程序按您想要的时间间隔运行(或在特定时间运行需要)。最简单的解决方案是使用工具进行web请求到wp-cron.php文件。。。

在我的案例中,这个问题发生在Wooccommerce的操作调度程序运行时。Action Scheduler是一个cron任务管理器,它与Wooccommerce一起提供,但也包括其他插件,例如wp-mail smtp。

我也有同样的问题,不知道出了什么问题。我试着调试Wordpress代码,得出的结论是,当一项任务在每一分钟的10秒内被安排好(也就是说,它被添加到计划任务中的那一刻)时,它就会立即被删除。这似乎是某种竞赛状态,动作调度程序只是将其从堆栈中弹出,而普通的wp-cron无法执行它,因为任务已经不在了。

我还需要说,我已经设置了crontab,每分钟调用wp-cron.php(而不是Wordpress的"假cron")。

当我用Action Scheduler的as_enqueue_async_action函数替换wp_schedule_single_event时,不再删除任何任务。

我认为另一种选择是卸载任何使用Action Scheduler的程序,但我还没有尝试过。

您正在使用Wordpress中的cron,但有些插件会禁用或阻止cron工作。在这种情况下,我的建议是,要么通过Server Cron创建这个时间表,要么安装一个插件来重申你的时间表。

我也有同样的问题,甚至有点难以找到。。。正如你所看到的,它没有最新的更新,但对我来说它是有效的。https://wordpress.org/plugins/wp-crontrol&https://br.wordpress.org/plugins/advanced-cron-manager/

您可以确定要编辑的Cron,从而在您的版本中具有更高的精度。还有其他插件可以也应该与此相关。你提到了cron的日程安排。这就是我指出这一点的原因。所以,你可以知道日历上的Chrome配置。WP Cron您可以编辑您的Cron时间表

最新更新