是的,有可能。。。
老实说,这通常是非常重要的。。。当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任务可能会被终止(可能会发生一些错误,或者它运行太长而被终止,等等)。在这种情况下,它不会删除信号量,因此所有未来的任务都不会工作。使用瞬态解决了这个问题,因为一段时间后瞬态将被删除如果有许多不同的操作要做呢所以让我们假设有许多不同的cron任务,它们不应该同时运行,但我们仍然希望它们都运行。。。
如果我们将解决方案与信号量一起使用,并且对所有这些任务只使用一个信号量,那么其中一些任务可能永远不会运行。那么该怎么办呢?
在这种情况下,你应该改变你的想法。您没有一些独立的任务,但有一个任务队列要执行。因此,您应该以这种方式实现它。
因此:
添加某种队列(可以使用数组并将其存储为选项,也可以添加自定义DB表)您可以使用当前的WP cron hourly事件将任务添加到队列中您添加了第二个运行频率更高的WP cron任务,它会逐个“吃掉”队列中的任务。这个“eater”任务应该使用信号量来确保一次只运行一个任务