【发布时间】:2016-05-11 20:10:55
【问题描述】:
我为我的 symfony2 项目创建了一个控制台命令,我想从控制器执行它而不阻塞控制器输出(在后台)。
通常是这样执行的:
$application = new Application($kernel);
$application->setAutoExit(true);
// AppBundle/Command/UpdateStockCommand.php
$input = new ArrayInput(array(
'command' => 'update:stock',
));
$output = new NullOutput();
$application->run($input, $output);
但是像这样运行用户将不得不等待任务完成,这可能需要几分钟。
解决办法是:
$kernel = $this->get('kernel');
$process = new \Symfony\Component\Process\Process('nohup php '. $kernel->getRootDir() .'/console update:stock --env='. $kernel->getEnvironment() .' > /dev/null 2>&1 &');
//$process->start();
$process->run();
没有给出错误,控制器渲染输出,但任务没有执行。
另一种解决方案是:
exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console update:stock --env=dev > /dev/null 2>&1 &');
在这里找到Symfony2 - process launching a symfony2 command 但不适用于我的示例。
【问题讨论】:
-
是
console在./app子目录中,还是在./bin子目录中(较新的symfony 版本) - 如果它在bin中,那么您需要更新控制台命令的路径。另外,$process->isSuccessful()在run()之后返回什么? -
另外,如果你在shell命令行中运行
nohup php PATH/console update:stock --env=ENV > /dev/null 2>&1 &,任务运行是否成功? -
控制台位于 app 文件夹中(我使用 symfony v2.8)。该命令在腻子中运行正常,但是有一个问题,如果我在运行命令后按任意键,它将终止该进程......我认为这是问题所在,因为我已经为输出放置了一个文本文件(而不是/dev/null),它显示了控制器的输出,它是一个 json 响应。
-
嗯我不明白,如果你在 putty 中运行命令,它应该启动命令并在后台运行它,你应该立即得到 shell (putty) 命令提示符。你是说,如果你按任意键,在命令提示符下它会停止在后台运行命令?
-
米罗,是的,没错。对我来说也很奇怪。你可以自己测试一下。
标签: symfony background-process symfony-process