Action Scheduler 是一个用于在将来某个时间(或在异步操作的情况下尽快)触发 WordPress 钩子的库。每个钩子可以使用唯一的数据进行调度,以便回调可以对该数据执行操作。钩子还可以调度在一个或多个场合运行。
我们可以将其视为对 do_action() 的扩展,增加了延迟和重复钩子的能力。
碰巧的是,这一功能还为在 WordPress 中处理大型任务队列提供了一个强大的后台处理工具。通过添加日志记录和管理界面,它还提供了后台处理任务的可追溯性。
久经考验的后台处理
每个月,Action Scheduler 都会处理数百万的订阅付款、WooCommerce 的 Webhooks 以及一系列其他插件的电子邮件和其他事件。
在实际网站上,它已被证明可以处理超过 50,000 个任务的队列,并以每小时超过 10,000 个操作的速度在 10 个并发队列中执行资源密集型操作,如处理付款和创建订单,而不会对正常网站操作产生负面影响。
所有这些都可以在插件作者控制之外的基础设施和 WordPress 网站上实现。
Action Scheduler 专为在 WordPress 插件(和主题)中分发而设计 – 无需服务器访问。如果你的插件需要后台处理,尤其是大批量任务的后台处理,Action Scheduler 可以提供帮助。
Action Scheduler 的工作原理
Action Scheduler 存储应在将来某个时间触发的动作的钩子名称、参数和计划日期。
调度程序将尝试每分钟运行一次,通过将自己作为回调附加到 action_scheduler_run_schedule
钩子来实现,该钩子使用 WordPress 内置的 WP-Cron 系统进行调度。每分钟还会在 WP Admin 请求的 shutdown
钩子上检查是否有待处理的动作,如果有,它将通过异步循环请求启动队列。
当被触发时,Action Scheduler 将检查计划在当前时间或之前运行的计划动作,即计划现在或过去某个时间运行的动作。异步计划的动作,即未计划的动作,具有零日期,意味着无论何时检查,它们总是到期。
批处理后台作业
如果有待处理的动作,Action Scheduler 将对一批 25 个操作进行唯一声明并开始处理该批操作。生成的 PHP 进程将继续处理 25 个操作的批次,直到使用了 90% 的可用内存或处理了 30 秒为止。
此时,如果还有其他动作要处理,将对站点发出异步循环请求以在新请求中继续处理动作。
此过程和循环请求将继续,直到所有动作都被处理完毕。
日常维护
在处理批次之前,调度程序将删除任何存在超过五分钟(或更具体地说,允许时间限制的 10 倍,默认值为 30 秒)的动作声明。
Action Scheduler 还会删除任何完成或取消超过一个月的动作。
如果一个动作运行超过 5 分钟,Action Scheduler 将假定该动作已超时并将其标记为失败。然而,如果所有附加到该动作的回调在超时后成功完成,其状态将随后更新为完成。
使用方法
我们可以把改库作为插件安装,或者直接作为一个库安装在我们的主题或插件中。安装之后,我们就可以安排和执行任务计划了。
安排任务计划
下面的代码中,我们使用钩子eg_midnight_log
安排操作在每天午夜运行。当运行这个操作时,挂载到eg_midnight_log 这个hook上的函数会被执行。
function eg_schedule_midnight_log() {
if ( false === as_has_scheduled_action( 'eg_midnight_log' ) )
as_schedule_recurring_action( strtotime( 'tomorrow' ), DAY_IN_SECONDS, 'eg_midnight_log', array(), '', true );
}
}
add_action( 'init', 'eg_schedule_midnight_log' );
function eg_log_action_data() {
error_log( 'It is just after midnight on ' . date( 'Y-m-d' ) );
}
add_action( 'eg_midnight_log', 'eg_log_action_data' );
传递参数
如果我们需要传递参数给执行操作的函数,添加任务计划的时候,我们需要以数组的形式把参数传递给任务计划,同时,执行这个操作的函数也必须接受同样数量的数组。
add_action( 'purchase_notification', 'send_purchase_notification', 10, 2 );
as_schedule_single_action( time(), 'purchase_notification', array(
'bob@foo.bar',
'Learning Action Scheduler (e-book)',
) );
function send_purchase_notification( $customer_email, $purchased_item ) {
wp_mail(
$customer_email,
'Thank you!',
"You purchased $purchased_item successfully."
);
}
可追溯的后台处理
我们的后台作业运行了吗?使用 Action Scheduler 内置的记录功能,不再需要猜测。每个动作的所有事件都记录在 actionscheduler_logs 表中,并显示在管理界面中。
默认记录的事件包括:
- 动作被创建时
- 动作开始时(包括如何运行的详细信息,例如通过 WP CLI 或 WP Cron)
- 动作完成时
- 动作失败时
如果因错误而失败,我们可以在管理界面中查看记录在错误记录中的日志,使得我们可以追踪在过去没有访问权限的网站上发生的错误。