Action Scheduler —— 来自WooCommerce的任务队列和后台处理库

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)
  • 动作完成时
  • 动作失败时

如果因错误而失败,我们可以在管理界面中查看记录在错误记录中的日志,使得我们可以追踪在过去没有访问权限的网站上发生的错误。

Related Posts

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注