ostark / craft-async-queue
一个将队列执行移动到非阻塞后台进程的队列处理器
Requires
- php: ^8.0
- craftcms/cms: ^5.0
- symfony/process: ^5.0|^6.0
Requires (Dev)
- craftcms/phpstan: *
- craftcms/rector: dev-main
- phpunit/phpunit: ^8.0|^9.0
This package is auto-updated.
Last update: 2024-09-19 08:35:17 UTC
README
使用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