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作业以处理所需的工作。
这是你可以很容易地用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扩展,但性能是惊人的。
谢谢乔恩,今天我会试试。为你+1。 –
工人的Cron使用是一件危险的事情。考虑一下:你用cron每分钟运行一个工人,但工人需要一分多钟才能完成这项工作。你结束了很多进程竞争资源,降低了整体性能。服务器可能会关闭。 –