8

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 &
4

2 回答 2

7

如果要创建后台进程,最好从文档中使用 start() 而不是 run()。如果您使用 run() 创建 process_max_time 可能会杀死您的进程

“而不是使用 run() 来执行一个进程,你可以 start() 它:run() 正在阻塞并等待进程完成, start() 创建一个后台进程。”

于 2013-06-20T09:33:58.880 回答
6

根据文档,我认为没有这样的选项: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() 方法”。

http://symfony.com/doc/master/components/process.html

于 2012-12-10T15:37:16.607 回答