Symfony2和后台进程


Symfony2 and Background processes

我的Symfony 2.3项目中有一个类正在处理一些http请求,需要一些时间。

我想将此任务作为后台进程运行,这样服务器就会向客户端返回一个答案,后台进程就会继续运行。

你知道在Symfony怎么做吗?

我找到了流程组件:http://symfony.com/doc/current/components/process.html但我不确定是否可以从那里运行类方法。

一个简单的方法是通过使用队列和symfony命令来处理队列,将繁重的工作与响应分离。

http://symfony.com/doc/current/components/console/introduction.html

创建一个symfony命令来处理添加到队列中的作业,然后从控制器将要完成的工作添加到队列。队列可能会实现为作业的数据库表。

这样,您就可以向用户返回成功响应,并定期在服务器上运行cron作业来处理所需的工作。

这是使用入队库可以轻松完成的操作。首先,您可以从各种传输中进行选择,如AMQP、STOMP、Redis、AmazonSQS、Filesystem等等

其次,它非常容易使用。让我们从安装开始:

您必须安装enqueue/enqueue-bundle库和其中一个传输。假设您选择文件系统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入队:consume--setup broker-vvv

在生产过程中,你很可能需要不止一个消费者,如果流程存在,就必须重新启动。要解决这个问题,您需要一种流程管理器。有几个选项:

http://supervisord.org/-您需要额外的服务。它必须正确配置。像这样的纯PHP流程管理器。基于Symfony进程组件和纯PHP代码。它可以处理进程重新启动、正确退出sigterm信号等等。像这样的php''swole流程管理器。它需要一个swoole PHP扩展,但它的性能是惊人的。