Symfony2和后台进程

问题描述:

我在我的Symfony 2.3项目中有一个类正在做一些http请求,需要一些时间。Symfony2和后台进程

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

你知道在Symfony中怎么做?

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

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

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

创建处理的作业添加到队列中的命令symfony中,然后加入从你的控制器做队列中的工作。该队列可能会作为作业的数据库表来实施。

通过这种方式,您可以将成功响应返回给用户,并定期在服务器上运行cron作业以处理所需的工作。

+0

谢谢乔恩,今天我会试试。为你+1。 –

+0

工人的Cron使用是一件危险的事情。考虑一下:你用cron每分钟运行一个工人,但工人需要一分多钟才能完成这项工作。你结束了很多进程竞争资源,降低了整体性能。服务器可能会关闭。 –

这是你可以很容易地用enqueue图书馆做的事情。首先,您可以从各种transports中进行选择,例如AMQP,STOMP,Redis,Amazon SQS,Filesystem等。其次,这是超级简单易用的。我们从安装开始:

您必须安装enqueue/enqueue-bundle库和one of the transports。假设你选择文件系统enqueue/fs库:

composer require enqueue/enqueue-bundle enqueue/fs 

现在让我们看看如何从您的文章脚本发送消息:

<?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:消费--setup-broker -vvv

在prod上,您最有可能需要多个消费者,并且如果该过程存在,则必须重新启动。为了解决这个问题,你需要一个流程管理器。有几种选择:

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