balpom/symfony-messenger-and-workerman

使用Workerman与Symfony Messenger的一个简单示例。

v2.0.2 2024-06-05 17:20 UTC

This package is auto-updated.

Last update: 2024-09-05 17:55:28 UTC


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