在一个新的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的解决方法对我不起作用。
有人有线索吗?
谢谢,问候, 乔乔
答案 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());