balpom / symfony-messenger-and-workerman
使用Workerman与Symfony Messenger的一个简单示例。
Requires
- php: >=8.1
- php-di/php-di: >=7.0
- symfony/cache: >=6.4
- symfony/doctrine-messenger: >=6.4
- symfony/event-dispatcher: >=6.4
- symfony/messenger: >=6.4
- symfony/process: >=6.4
- symfony/rate-limiter: >=6.4
- workerman/workerman: >=4.1
README
一个简单的示例,展示如何使用Workerman和带有队列的Symfony Messenger。
找不到使用Symfony Messenger的简单且完整的示例,我决定自己创建一个:[https://github.com/balpom/symfony-messenger-sample](https://github.com/balpom/symfony-messenger-sample)。它使用Doctrine与sqlite数据库作为消息总线传输,并且对于运行Worker使用Symfony Console。
然而,我内心的完美主义者不喜欢手动打开控制台、运行脚本等。我希望使用一条命令同时打开多个控制台,数量适当,其中Worker已经在工作,如果其中一个Worker崩溃,控制台会自动重启(支持一定数量的运行中的控制台(脚本))。
因此,我创建了一个新的示例,其中我完全放弃了symfony/console组件,并且对于启动Worker以及维护一定数量的它们,我使用Workerman框架([https://github.com/walkor/workerman](https://github.com/walkor/workerman))。
所有测试均在Linux上进行。
要求
- PHP >= 8.1
安装
使用composer(推荐)
composer create balpom/symfony-messenger-and-workerman
如何使用
打开控制台窗口。运行以下命令
php bin/start
它启动了三个简单的Worker,它们模仿短信发送。现在它正在等待从队列中发送消息,但队列仍然是空的。
运行以下命令
php tests/send.php
它运行一个简单的脚本,将一些消息添加到队列中。之后,在之前自动打开的控制台中,您可能会看到几个Worker“发送”短信。
运行以下命令
php tests/sendmany.php
它运行一个简单的脚本,将大量消息添加到队列中。
运行以下命令
php bin/reload
它重新加载所有Worker。重新加载所有Worker后继续执行。
运行以下命令
php bin/stop
它停止所有Worker的执行。
特点
我创建的SymfonyWorker类是对Symfony\Component\Messenger\Worker的封装,并基于ConsumeMessagesCommand类(Symfony\Component\Messenger\Command\ConsumeMessagesCommand)构建。
为Workerman\Worker运行,我创建了一个非常简单的脚本bin/runner
namespace Balpom\SymfonyMessengerWorkerman; use Workerman\Worker; use Symfony\Component\Process\Process; Worker::$daemonize = true; // Always run as daemon. $worker = new Worker(); $worker->count = 3; // Numbef of Workers. $worker->onWorkerStart = function (Worker $worker) { //$process = new Process(['php', 'bin/start_worker']); //SymfonyWorkerFactory::getWorker(__DIR__ . '/../config/dependencies.php')->run(); $pid = \posix_getpid(); // Current Workerman's Worker PID. $line = 'bash -c "gnome-terminal --wait -- php bin/start_worker; kill -SIGQUIT ' . $pid . '"'; $process = Process::fromShellCommandline($line); $process->run(); }; Worker::runAll();
它包含以下行:$line = 'bash -c "gnome-terminal --wait -- php bin/start_worker; kill -SIGQUIT ' . $pid . '"';
如果您的系统中没有 gnome-terminal,您必须将此行替换为您终端中运行 "php bin/start_worker" 的行。
您还可以通过以下命令直接从 "bin/runner" 脚本运行、停止和重新加载worker
php bin/runner start php bin/runner reload php bin/runner stop
要检查当前状态,请尝试此命令
php bin/runner status