在开发 WordPress 应用程序的时候,我们偶尔会进行一些比较耗时的操作,比如同时给 1000 个订阅用户发送邮件,如果这么多邮件通过一个任务同时发送,很可能会导致 PHP 进程执行超时而退出,进而引起部分任务执行失败,这个时候,我们需要使用任务队列来分批执行任务。WordPress 并没有内置的任务队列实现,我们只能自己添加或者借助第三方库实现,今天为大家介绍的就是一个在 WordPress 中实现任务队列的库:WP QueueThe
WP Queue 的工作原理和安装方法
和大多数任务队列一样,WP Queue 是基于数据库实现的一个任务队列系统。有了各个任务队列系统,我们只需要需要把任务推送到任务队列里面,然后让 WP Queue 按照设置好的规则逐个执行。安装 WP Queue 库的方法很简单,直接在主题或插件项目的根目录执行 composer require a5hleyrich/wp-queue
即可。
由于 WP Queue 只是一个 PHP 库,而不是一个插件,在使用之前,我们需要先安装任务队列需要的数据表到 WordPress Database中。执行下列语句把数据表安装到 WordPress 数据库中即可,如果是在 phpMyAdmin 中直接执行,需要先把 {$wpdb->prefix}
换成对应的 WordPress 数据表前缀,一般是wp_
The
CREATE TABLE {$wpdb->prefix}queue_jobs (
id bigint(20) NOT NULL AUTO_INCREMENT,
job longtext NOT NULL,
attempts tinyint(3) NOT NULL DEFAULT 0,
reserved_at datetime DEFAULT NULL,
available_at datetime NOT NULL,
created_at datetime NOT NULL,
PRIMARY KEY (id)
CREATE TABLE {$wpdb->prefix}queue_failures (
id bigint(20) NOT NULL AUTO_INCREMENT,
job longtext NOT NULL,
error text DEFAULT NULL,
failed_at datetime NOT NULL,
PRIMARY KEY (id)
如果我们在 WordPress Theme或插件中使用 WP Queue 库,在主题或插件初始化的时候,我们可以调用 wp_queue_install_tables()
辅助函数来安装数据表。
使用 WP Queue 实现任务队列
把任务添加到任务队列之前,我们需要先实现一个任务类,任务类应该扩展 WP_Queue\Job 类,通常只需要包含一个任务处理方法,当队列执行任务的时候会调用该方法,任务所需的数据应传递给该类的构造函数并设置公开访问属性。从队列中获取任务后,我们可以访问这些数据。下面是一个示例任务类:
<?php
use WP_Queue\Job;
class Subscribe_User_Job extends Job {
/**
* @var int
*/
public $user_id;
/**
* Subscribe_User_Job constructor.
*
* @param int $user_id */
public function __construct( $user_id ) {
$this->user_id = $user_id;
}
/**
* 处理任务逻辑
*/
public function handle() {
$user = get_user_by( 'ID', $this->user_id );
// 处理用户...
}
}
调度任务队列中的任务
创建了任务类之后,我们可以用下面的方法把任务添加到任务队列中,以便任务队列按照队列顺序执行:
wp_queue()->push( new Subscribe_User_Job( 12345 ) );
我们可以在添加任务到队列的时候,通过一个附加参数来设置任务队列延迟执行。比如,通过下面的方法添加的任务将会延迟 1 小时执行。
wp_queue()->push( new Subscribe_User_Job( 12345 ), 3600 );
定制执行任务队列
任务队列需要一个任务调度器来执行,通过下面的方法可以安排一个计划任务来调度执行任务队列中的任务。该任务队列在 WordPress 的计划任务系统上实现。
wp_queue()->cron();
此外,我们还可以指定任务队列中的任务失败的时候,重新尝试执行的次数。
wp_queue()->cron( 3 );
通过使用 WP Queue 类,在 WordPress Theme或插件中执行大量重复且耗时操作的时候,我们就可以使用任务队列系统来保证操作的可靠性和系统的性能了。如果你需要一个实际的参考示例,可以查看一下 WP Image Processing Queue 图像处理库的代码,看一个这个库是怎么使用 WP Queue 添加计任务队列的。