【问题标题】:How to run custom Symfony2 command in background如何在后台运行自定义 Symfony2 命令
【发布时间】:2012-12-10 14:23:17
【问题描述】:

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 &

【问题讨论】:

  • 我们最近遇到了同样的问题并使用RabbitMQBundle解决了它

标签: php symfony


【解决方案1】:

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

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

【讨论】:

  • 你能详细说明process_max_time吗?除了您的帖子之外,Google 不会返回任何相关结果。
  • @gadelat 可能意味着php.ini中的一个选项:max_execution_time
【解决方案2】:

根据文档我认为没有这样的选项: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

【讨论】:

  • 在没有深入调查细节的情况下,我使用$process->start() instaed of $process->run() 做到了这一点
  • 似乎 run() 调用 start() 然后 wait() 所以在你的情况下你是对的,你应该使用 start。 link
猜你喜欢
  • 1970-01-01
  • 2013-10-19
  • 2016-04-06
  • 2013-08-08
  • 1970-01-01
  • 2018-12-21
  • 2013-10-19
  • 2011-11-24
相关资源
最近更新 更多