当Cron阵列中塞满了多个任务时,很有可能是您忘记检查队列中是否已经有未完成的任务,或者配置错误。config数组用于标识队列中的任务。这意味着如果您在以下方面存在拼写错误或其他差异wp_next_schedule()
检查和wp_schedule_event()
, 然后检查就会成功,你很容易就会一次又一次地添加任务。确保你double check 那个最好在钩子和配置中都使用一个变量,以免出错。
add_action( \'wp_loaded\', function()
{
$hook = \'your_custom_event\';
$task = new YourCronHandler();
// Config: An Array of arrays
$config = [ ( include __DIR__.\'/config.php\' ), ];
add_action( $hook, $task );
// Make sure to not run during installation or if there\'s already a task added
if (
! defined( \'WP_INSTALLING\' )
&& ! wp_next_scheduled( $hook, $config )
) {
wp_schedule_event(
time(),
\'thirtymin\',
$hook,
$config
);
}
} );
然后只需构建处理程序:
class YourCronHandler
{
public function __invoke( Array $config = [] )
{
// Bootstrap your process here
}
}
配置可以很容易地分离为一个独立的文件。这样做将有助于使事情更易于阅读,甚至可以重用。
<?php
return [
\'foo\' => \'bar\',
];
旁注:当您的cron作业正在运行时,WP会自动向数据库添加cron锁,因此您不必担心负载平衡器和它背后的不同服务器会多次运行同一任务。这可能不是您的问题,但在这种情况下,最好在
wp-config.php
只需从单个服务器上的cron选项卡手动触发cron即可。
完成上述示例的时间间隔
如果您需要不同的时间间隔,这很容易:
add_filter( \'cron_schedules\', function( Array $schedules = [] )
{
return $schedules + [
\'thirtymin\' => [
\'interval\' => HOUR_IN_SECONDS / 2,
\'display\' => \'Every Thirty Minutes\'
],
];
} );