10up/wp-minions

此包已被废弃且不再维护。未建议替代包。

WordPress任务队列

安装: 191,271

依赖项: 0

建议者: 0

安全: 0

星标: 231

关注者: 105

分支: 40

开放问题: 11

类型:wordpress-plugin

4.1.0 2018-11-05 20:41 UTC

This package is auto-updated.

Last update: 2024-05-02 18:52:30 UTC


README

提供使用任务队列的框架,用于在WordPress中异步执行任务。提供与GearmanRabbitMQ的集成。

Support Level Build Status Release Version GPLv2 License

注意

截至2024年4月12日,此项目已归档且不再积极维护。

背景与目的

随着WordPress成为越来越大型出版商越来越受欢迎的发布平台,随着工作流程的复杂化,对越来越复杂和资源密集型任务的需求也不断增加。像生成报告、昂贵的API调用、将用户同步到邮件提供商或甚至从源中摄取内容等任务都需要大量时间或大量内存(或两者都需要),并且通常不能在Web服务器的常规限制内完成,因为像超时和内存限制这样的因素会阻碍。

WP Minions提供了一些辅助函数,允许您将任务添加到队列中,并指定一个触发任务的行动,只需使用add_action()钩入该动作的回调即可。

在配置过程中,指定了一系列的Minions(工作进程)。由于Minions是免费的,它们将从队列中取出下一个任务,调用动作,并且任何钩入动作的回调将被执行。

在需要更多RAM或更高超时的场景下,一个单独的服务器来处理任务是最理想的——只需在该服务器上设置WordPress(与标准Web服务器相同的目录),并增加资源。确保不要将任何生产流量发送到该服务器,它将专门处理队列中的任务。

安装

  1. 在WordPress中安装插件。如果需要,您可以下载zip文件并通过WordPress插件安装程序进行安装。

  2. 在网站根目录下(与wp-settings.php相同的目录)创建一个指向插件中wp-minions-runner.php文件的符号链接(或者复制该文件,但符号链接将确保在插件更新时它也得到更新)

  3. wp-config.php中定义一个唯一的盐值,以确保多个安装不会冲突。

define( 'WP_ASYNC_TASK_SALT', 'my-unique-salt-1' );

注意:如果您正在使用多站点,您还需要将以下内容添加到您的wp-config.php文件中,在多站点定义块之后之后。这是由于多站点依赖于HTTP_HOST来检测它正在运行的网站/博客。您还希望在多站点配置中实际定义DOMAIN_CURRENT_SITE

if ( ! isset( $_SERVER['HTTP_HOST'] ) && defined( 'DOING_ASYNC' ) && DOING_ASYNC ) {
  $_SERVER['HTTP_HOST'] = DOMAIN_CURRENT_SITE;
}
  1. 接下来,您需要选择您的工作队列系统。默认支持Gearman和RabbitMQ。

Gearman

要运行所有这些,有几个部分需要设置。首先,需要设置Gearman后端——这部分将根据您的操作系统而有所不同。完成后,我们可以安装WordPress插件,并设置WordPress的配置选项。

后端设置 - CentOS 6.x

  1. 您需要为 gearman 安装 EPEL 仓库,并为一些 PHP 软件包安装 REMI 仓库。请确保启用适合您使用的 PHP 版本的 remi 仓库。
    • wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm && rpm -Uvh epel-release-6*.rpm
    • wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && rpm -Uvh remi-release-6*.rpm
    • rm *.rpm
  2. 确保已启用 remi 仓库,以及您可能希望在 /etc/yum.repos.d/remi.repo 中使用的任何特定版本的 PHP。
  3. yum install gearmand php-pecl-gearman python-pip
  4. easy_install supervisor
  5. chkconfig supervisord on && chkconfig gearmand on
  6. 如果所有内容都在一个服务器上运行,我建议仅限制连接到 localhost。如果不是,您需要设置防火墙规则,仅允许某些客户端在 Gearman 端口(默认 4730)上连接。
  • 编辑 /etc/sysconfig/gearmand - 设置 OPTIONS="--listen=localhost"
  1. service gearmand start

后端设置 - CentOS 7.x

  1. 您需要为 gearman 安装 EPEL 仓库,并为一些 PHP 软件包安装 REMI 仓库。
    • yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    • yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
  2. yum install gearmand php-pecl-gearman --enablerepo=remi-php<php version on your system>。例如,如果您正在使用 php 7.2,则您的命令将类似于 yum install gearmand php-pecl-gearman --enablerepo=remi-php72
  3. 可选,如果您愿意,可以安装 supervisord
    • yum install python-pip
    • easy_install supervisor
  4. 如果所有内容都在一个服务器上运行,我建议仅限制连接到 localhost。如果不是,您需要设置防火墙规则,仅允许某些客户端在 Gearman 端口(默认 4730)上连接。
    • 编辑 /etc/sysconfig/gearmand - 设置 OPTIONS="--listen=localhost"
  5. systemctl enable gearmand
  6. systemctl start gearmand

后端设置 - Ubuntu

在执行此操作的过程中,您可能需要安装其他附加包,如果您还没有的话,例如 php-pear 或 php*-dev 包。

  1. apt-get update
  2. apt-get install gearman python-pip libgearman-dev supervisor
  3. pecl install gearman
  4. pecl 安装完成后,它将告诉您将类似于 extension=gearman.so 的内容放入您的 php.ini 文件中 - 这样做。
  5. update-rc.d gearman-job-server defaults && update-rc.d supervisor defaults
  6. 如果所有内容都在一个服务器上运行,我建议仅限制连接到 localhost。如果不是,您需要设置防火墙规则,仅允许某些客户端在 Gearman 端口(默认 4730)上连接。
  • 编辑 /etc/default/gearman-job-server - 设置 PARAMS="--listen=localhost"
  1. service gearman-job-server restart

Supervisor 配置

根据需要填写 <brackets> 中的值,将以下配置添加到 /etc/supervisord.conf(CentOS)或 /etc/supervisor/supervisord.conf(Ubuntu)。

[program:my_wp_minions_workers]
command=/usr/bin/env php <path_to_wordpress>/wp-minions-runner.php
process_name=%(program_name)s-%(process_num)02d
numprocs=<number_of_minions>
directory=<path_to_temp_directory>
autostart=true
autorestart=true
killasgroup=true
user=<user>
  • path_to_wordpress: WordPress 安装根目录的绝对路径,例如:/var/www/html/wordpress
  • number_of_minions: 应生成多少个 minion(一次可以运行多少个作业)。
  • path_to_temp_directory: 可能应该与 path_to_wordpress 相同。
  • user: 在其下运行进程的系统用户,可能是 apache(CentOS)、nginx(CentOS)或 www-data(Ubuntu)。
  • 如果您愿意,可以将 "my_wp_minions_workers" 文本更改为更具有描述性的内容。

更新 supervisor 配置后,重新启动服务(CentOS 或 Ubuntu)

systemctl restart supervisord
service supervisor restart

Systemd 配置(CentOS 7.x)

根据需要填写 <brackets> 中的值,将以下内容添加到 /etc/systemd/system/wp-minions-runner@.service

[Unit]
Description=WP-Minions Runner %i
After=network.target

[Service]
PIDFile=/var/run/wp-minions-runner.%i.pid
User=<user>
Type=simple
ExecStart=/usr/bin/env php <path_to_wordpress>/wp-minions-runner.php
Restart=always

[Install]
WantedBy=multi-user.target
  • path_to_wordpress: WordPress 安装根目录的绝对路径,例如:/var/www/html/wordpress
  • user: 在其下运行进程的系统用户,可能是 apache(CentOS)、nginx(CentOS)或 www-data(Ubuntu)。

重新加载 systemd

systemctl daemon-reload

启用并启动您想要运行的任何数量的运行程序

systemctl enable wp-minions-runner@{1..n}
systemctl start wp-minions-runner@{1..n}

其中 'n' 是您想要的进程数。

WordPress 配置

在您的 wp-config.php 中定义 WP_MINIONS_BACKEND 常量。有效值是 gearmanrabbitmq。如果为空,则默认为 cron 客户端。

define( 'WP_MINIONS_BACKEND', 'gearman' );

如果您的作业队列服务不在本地运行或使用非标准端口,您需要在 wp-config.php 中定义您的服务器。

# Gearman config
global $gearman_servers;
$gearman_servers = array(
  '127.0.0.1:4730',
);
# RabbitMQ config
global $rabbitmq_server;
$rabbitmq_server = array(
  'host'     => '127.0.0.1',
  'port'     => 5672,
  'username' => 'guest',
  'password' => 'guest',
);

Note: On RabbitMQ the guest/guest account is the default administrator account, RabbitMQ will only allow connections connections on that account from localhost. Connections to any non-loopback address will be denied. See the RabbitMQ manual on [user management](https://rabbitmq.cn/rabbitmqctl.8.html#User_Management) and [Access Control](https://rabbitmq.cn/rabbitmqctl.8.html#Access_Control) for information on adding users and allowing them access to RabbitMQ resources.

## MySQL Persistent Queue (Recommended)

By default, gearman will store the job queue in memory. If for whatever reason the gearman service goes away, so does the queue. For persistence, you can optionally use a MySQL database for the job queue:

#### CentOS

Edit the gearman config at ```/etc/sysconfig/gearmand```, adding the following to the OPTIONS line (or creating the line, if it doesn't exist yet), inserting database credentials as necessary:
```sh
OPTIONS="-q MySQL --mysql-host=localhost --mysql-port=3306 --mysql-user=<user> --mysql-password=<password> --mysql-db=gearman --mysql-table=gearman_queue"

Ubuntu

/etc/default/gearman-job-server 中编辑 gearman 配置,在 PARAMS 行添加以下内容(如果该行不存在,则创建该行),并根据需要插入数据库凭据

PARAMS="-q MySQL --mysql-host=localhost --mysql-port=3306 --mysql-user=<user> --mysql-password=<password> --mysql-db=gearman --mysql-table=gearman_queue"

注意:对于某些配置,上面的方法可能不起作用,因为 /etc/default/gearman-job-server 不会被读取。如果您看不到持久队列设置,则

  1. 在 mysql 中创建一个 gearman 数据库(数据库必须在数据库中存在,但当 gearmand 首次初始化时,它将创建表)。
  2. /etc/gearmand.conf 中创建一个文件
  3. 在文件中将配置粘贴到一行上
-q MySQL --mysql-host=localhost --mysql-port=3306 --mysql-user=<user> --mysql-password=<password> --mysql-db=gearman --mysql-table=gearman_queue

然后重新启动 gearman-job-server: sudo service gearman-job-server restart

验证

一旦安装完成,您可以使用位于 system-tests/YOURQUEUE 目录中的 test-client.phptest-worker.php 文件快速确保您的作业队列正在接受作业。工作器被配置为反转传递给它的任何文本。在客户端文件中,我们将 "Hello World" 传递给工作器。

在一个窗口中运行 php test-worker.php - 您现在将有一个工作进程正在运行,等待作业。

在另一个窗口中运行 php test-client.php "Hello World" - 您应该在屏幕上看到 "dlroW olleH"。

完成测试后,使用 ctrl-c 停止工作进程。

用法

一旦配置并激活,您将可以使用 wp_async_task_add()。如果您熟悉 wp_schedule_single_event(),那么 wp_async_task_add() 的工作方式应该非常熟悉。

该函数最多接受三个参数,第一个参数是必需的

  1. $hook:这是在作业运行时要执行的动作钩子的名称。您的回调函数应该使用 add_action( $hook, $callback ) 钩入此钩子
  2. $args:这是可选的,默认为空数组。您可以传递一个任意数据数组到此处,它将被传递到您的回调函数中。
  3. $priority:这是可选的,默认为 "normal"。其他有效选项是 "high" 或 "low"。高优先级作业将在正常优先级作业之前运行,即使正常优先级作业已经在队列中更长的时间。

当有工作进程空闲时,在数据库中设置一个选项

// Add a task, that will call the "myplugin_update_option" action when it is run
wp_async_task_add( 'myplugin_update_option', array( 'mykey' => 'myvalue' ) );

function myplugin_update_option_callback( $args ) {
	// In reality, you are probably doing a lot of resource intensive work here
	update_option( 'my-option-name', $args['mykey'] );
}

// Add the action that links the task and the callback.
// Notice the hook below is the same as the hook provided to wp_async_task_add.
add_action( 'myplugin_update_option', 'myplugin_update_option_callback' );

一旦一个工作进程空闲,并运行上述任务,您在选项表中会有一个名为 "my-option-name" 的选项,其值为 "myvalue",因为 "myvalue" 通过 $args 传递进来。

自定义

以下常量可用于自定义 WP Minions 的行为。

  1. WP_MINIONS_JOBS_PER_WORKER - 每个工作进程执行的作业数,默认为 1。每个工作进程运行多个作业将减少生成的工作进程数量,并且可以显着提高性能。然而,过大的值如果存在内存泄漏问题,则会导致问题。请谨慎使用。

  2. WP_MINIONS_CLIENT_CLASS - 您还可以更改用于向作业队列发送作业的客户端类。它应与 \WpMinions\Client 的接口相匹配。

  3. WP_MINIONS_WORKER_CLASS - 同样,您也可以更改用于执行作业的工作进程类。它应与 \WpMinions\Worker 的接口相匹配。

问题

如果您发现任何错误或有改进插件的想法,请 打开一个问题。我们很期待看到社区对这个项目的看法,我们非常希望得到您的反馈!

支持级别

存档:该项目不再由 10up 维护。我们不再响应问题或拉取请求,除非它们与安全问题相关。我们鼓励感兴趣的开发商分叉此项目,并使其成为自己的项目!

喜欢你所看到的吗?

68747470733a2f2f313075702e636f6d2f75706c6f6164732f323031362f31302f313075702d4769746875622d42616e6e65722e706e67