symfony / process - 静默处理而不是启动

时间:2014-12-22 16:14:15

标签: php symfony nginx process symfony-process

在一个新的symfony2项目中(如here所述的安装),我想在请求中启动一个控制台进程。该应用程序使用nginx + php-fpm在“标准”ubuntu 14.04框上运行。

考虑这个控制器代码:

<?php
namespace AppBundle\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Process\Process;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class CommandController extends Controller
{
    /**
     * @Route("/command")
     * @return JsonResponse
     */
    public function commandAction ()
    {
        $rootDir = $this->get('kernel')->getRootDir();
        $env = $this->get('kernel')->getEnvironment();
        $commandline = $rootDir . '/console --env=' . $env . ' acme:hello --who jojo'
        $process = new Process($commandline);
        $process->start();
        return new JsonResponse(array('command' => $commandline));
    }
}

当我向/ command发出请求时,我得到了我的预期结果并且该过程开始,例如我用htop之类的东西看到了它。 当我再次发出此请求时,我得到了我的预期结果,但是要启动的进程不会出现在任何地方。没有错误,没有任何错误。

重新启动php5-fpm服务使我能够再次通过请求启动一个进程,所以基本上我需要在每次请求后重启整个php服务。所以这可能不是编程问题。但老实说,我还不知道。 问题在stackoverflow之前描述,Symfony2 - process launching a symfony2 command,但exec的解决方法对我不起作用。

有人有线索吗?

谢谢,问候, 乔乔

2 个答案:

答案 0 :(得分:7)

你的过程很可能在它完成工作之前就已经死了。这是因为PHP在响应返回给客户端并且连接关闭后将其终止。

Process::start()用于start a process asynchronously。您需要wait()才能完成或检查是否已完成isRunning()

$process->start();

$process->wait(function ($type, $buffer) {
    // do sth while you wait
});

或者,使用Process::run()代替Process:start()

如果要在后台处理某些内容,请使用消息队列。

答案 1 :(得分:0)

只是2020年的一个更新...。我收到了一个无提示错误,并进行了调试

$process = new Process($command);
$process->run();
print_r($process->getErrorOutput());