Symfony2使开发人员能够创建自己的命令行命令。它们可以从命令行执行,也可以从控制器执行。根据Symfony2官方文档,可以这样做:
protected function execute(InputInterface $input, OutputInterface $output)
{
$command = $this->getApplication()->find('demo:greet');
$arguments = array(
...
);
$input = new ArrayInput($arguments);
$returnCode = $command->run($input, $output);
}
但在这种情况下,我们等待命令完成它的执行并返回返回代码。
如何从控制器 执行命令将其分配到后台而不等待它完成执行?
换句话说,什么等同于
$ nohup php app/console demo:greet &
答案 0 :(得分:7)
根据文件,我认为没有这样的选择:http://api.symfony.com/2.1/Symfony/Component/Console/Application.html
但是关于你想要实现的目标,我认为你应该使用过程组件:
use Symfony\Component\Process\Process;
$process = new Process('ls -lsa');
$process->run(function ($type, $buffer) {
if ('err' === $type) {
echo 'ERR > '.$buffer;
} else {
echo 'OUT > '.$buffer;
}
});
正如文档中所提到的“如果您希望能够实时获得一些反馈,只需将匿名函数传递给run()方法”。
答案 1 :(得分:7)
如果要创建后台进程,从文档中更好地使用start()而不是run()。如果使用run()
创建进程,则process_max_time可能会终止进程“而不是使用run()来执行进程,你可以启动()它:run()阻塞并等待进程完成,start()创建一个后台进程。”