Symfony2和后台进程

时间:2013-11-22 14:26:07

标签: php symfony process background symfony-process

我的Symfony 2.3项目中有一个类正在执行一些http请求并需要一些时间。

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

你知道如何在Symfony中做到这一点吗?

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

2 个答案:

答案 0 :(得分:7)

执行此操作的一种简单方法是使用队列和symfony命令来处理队列,从而将繁重的工作与响应分开。

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

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

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

答案 1 :(得分:0)

这是您可以使用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

在产品上,您最有可能需要一个以上的消费者,如果该过程存在,则必须重新启动。要解决这个问题,您需要一种流程管理器。有几种选择:

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