使用enqueue 库可以轻松做到这一点。首先,您可以从多种transports中进行选择,例如AMQP、STOMP、Redis、Amazon SQS、Filesystem等。
其次,它超级好用。让我们从安装开始:
您必须安装enqueue/enqueue-bundle 库和one of the transports。假设你选择文件系统enqueue/fs库:
composer require enqueue/enqueue-bundle enqueue/fs
现在让我们看看如何从 POST 脚本发送消息:
<?php
use Enqueue\Client\ProducerInterface;
use Symfony\Component\DependencyInjection\Container;
/** @var Container $container */
/** @var ProducerInterface $producer */ $producer = $container->get('enqueue.client.producer');
$producer->sendCommand('a_background_task', 'task_data');
对于消费,你必须创建一个处理器服务并用enqueue.client.processor标签标记它:
<?php
use Enqueue\Client\CommandSubscriberInterface;
use Enqueue\Psr\PsrContext;
use Enqueue\Psr\PsrMessage;
use Enqueue\Psr\PsrProcessor;
class BackgroundTask implements PsrProcessor, CommandSubscriberInterface
{
public static function getSubscribedCommand()
{
// do job
return self::ACK;
}
public function process(PsrMessage $message, PsrContext $context)
{
return 'a_background_task';
}
}
并使用命令运行消费者:
./bin/console enqueue:consume --setup-broker -vvv
在 prod 上,您很可能需要不止一个消费者,如果存在该流程,则必须重新启动它。为了解决这个问题,您需要一种流程管理器。有几种选择:
http://supervisord.org/ - 您需要额外的服务。它必须正确配置。
像这样的纯 PHP 进程管理器。基于 Symfony 进程组件和纯 PHP 代码。它可以处理进程重启、正确退出 sigterm 信号等等。
像这样的 php\swoole 进程管理器。它需要一个 swoole PHP 扩展,但它的性能是惊人的。