ostark/craft-async-queue

一个将队列执行移动到非阻塞后台进程的队列处理器

安装次数: 263,438

依赖项: 11

建议者: 0

安全性: 0

星标: 93

关注者: 2

分支: 7

开放问题: 4

类型:craft-plugin

4.0.0 2024-04-19 07:36 UTC

README

Latest Stable Version Total Downloads Monthly Downloads Buy us a tree

使用Craft的工作队列,您可以在后台运行重任务。不幸的是,这并不完全正确。当 runQueueAutomatically => true(默认)时,工作队列由ajax(FPM)调用处理。当队列中有许多作业且PHP-FPM进程有限时,这可能会破坏您的网站。此插件替换了Craft的默认队列处理器,并将队列执行移动到非阻塞的后台进程。在将作业推送到队列后,立即执行 craft queue/run 命令。

在这里您可以找到我在 craftcms/cms 上开始的初始讨论。

赞助商 🐇

开发在我的业余时间进行,但也在工作时间内。感谢 fortrabbit.com

许可证 🌳

此软件包是 Treeware。如果您在生产中使用它,我们要求您 为世界买一棵树 以感谢我的工作。通过为Treeware森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。

要求

  • Craft 3或4
  • 执行PHP二进制文件的权限
  • proc_open()
  • PHP >=7.1(对于PHP 7.0,请使用 ostark/craft-async-queue:1.3.*

安装

cd your/craft-project
composer require ostark/craft-async-queue
php craft install/plugin async-queue

如果您遇到Composer版本冲突

composer config platform --unset
composer update
php craft migrate/all
composer require ostark/craft-async-queue
php craft install/plugin async-queue

配置(可选)

该插件使用 symfony/process 执行 php 二进制文件。通常二进制文件位于 /usr/bin/,但也自动检测其他常见位置。使用ENV变量 PHP_BINARY,您可以显式设置路径,例如在您的 .env 文件中如下所示

PHP_BINARY="/usr/local/Cellar/php71/7.1.0_11/bin/php"

默认情况下,1 个后台进程处理队列。您可以使用 ASYNC_QUEUE_CONCURRENCY ENV变量修改此行为。

# No concurrency
ASYNC_QUEUE_CONCURRENCY=1

# Or max 5 background processes
ASYNC_QUEUE_CONCURRENCY=5

要禁用特定环境的插件,例如尚未支持的Windows,请设置 DISABLE_ASYNC_QUEUE ENV变量。

DISABLE_ASYNC_QUEUE=1

请注意,插件将覆盖Craft CMS的 runQueueAutomatically 设置。无需配置。

测试

除了可以从命令行使用此快捷方式运行的测试套件 composer tests,您还可以在Craft CP中执行测试。转到 工具 > 异步队列测试,然后单击 运行测试 按钮。

事件

在后台运行的命令基本上是 php craft queue/run,但是我们添加了一些特定于Linux的语法,以非阻塞方式执行该命令。通过将 useDefaultDecoration 设置为 false,您可以防止此操作。您还可以修改命令本身。

// Add handler
\yii\base\Event::on(
     \ostark\AsyncQueue\QueueCommand::class,
     \ostark\AsyncQueue\QueueCommand::EVENT_PREPARE_COMMAND,
     function(\ostark\AsyncQueue\Events\QueueCommandEvent $event) {
         $event->useDefaultDecoration = false;
         $event->commandLine = "BEFORE {$event->commandLine} AFTER";
     }
);

内部:进程列表

空队列(仅运行php-fpm主进程)

$ ps auxf | grep php

root      2953  0.0  0.0 399552 13520 ?        Ss   12:27   0:00 php-fpm: master process (/etc/php/fpm.conf)

推入新作业(php-fpm主进程 + 子进程 + /usr/bin/php守护进程启动)

$ ps auxf | grep php

root      2953  0.0  0.0 399552 13520 ?        Ss   12:27   0:00 php-fpm: master process (/etc/php/fpm.conf)
app       3031  2.2  0.2 718520 45992 ?        S    12:31   0:00  \_ php-fpm: pool www
app       3033  1.2  0.2 280936 32808 ?        S    12:31   0:00 /usr/bin/php craft queue/run
app       3034  0.0  0.0   4460   784 ?        S    12:31   0:00  \_ sh -c /usr/bin/php craft queue/exec "1234" "0" "1"
app       3035  1.2  0.2 280928 32280 ?        S    12:31   0:00      \_ /usr/bin/php craft queue/exec 1234 0 1