Symfony2后台脚本结束后运行的进程?

时间:2015-04-21 12:22:36

标签: php symfony background-process

Symfomaniacs!

假设我的控制器中有这个代码:

        for ($i = 0; $i <= 3; $i++) 
        {
            $command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob ' 
                                         . $i . ' --env=' . $kernel->getEnvironment();
            $logger->addInfo("Executing command: ".$command);
            $process = new Process($command);
            $process->disableOutput();
            $process->start();
        }
        //sleep(5);
        return $this->render(...);

并且ExecuteJob大约需要5秒钟才能执行。在console命令中,我在开始和结束脚本中都有一个logger-&gt; addInfo()。

如果我取消注释 sleep(5) 行,则会同时打印。如果我不这样做,只有初始行打印在日志中,这必须意味着当控制器脚本结束时,它会停止所有进程,我错了吗?

有没有办法解决这个问题?我愿意改变设计,我只是想执行背景资料而不必等待呈现页面(甚至与该页面不相关

PS:我正在寻找一种方法来运行与Symfony2 玩得很好的后台任务,而不是怪异的php hacks cron jobs 。我知道那些。我也不想设置 MQ队列。对于我正在尝试的事情来说,这有点过分。

3 个答案:

答案 0 :(得分:1)

在您的情况下,完美的解决方案是使用kernel.terminate Event,它会在响应流式传输到客户端后触发,因此您可以在那里执行一些繁重的操作。

答案 1 :(得分:0)

你需要这样的https://github.com/schmittjoh/JMSJobQueueBundle,但你也需要设置cron

答案 2 :(得分:-1)

在命令中使用&将其发送到后台,如此

$command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob &'