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队列。对于我正在尝试的事情来说,这有点过分。答案 0 :(得分:1)
在您的情况下,完美的解决方案是使用kernel.terminate Event,它会在响应流式传输到客户端后触发,因此您可以在那里执行一些繁重的操作。
答案 1 :(得分:0)
你需要这样的https://github.com/schmittjoh/JMSJobQueueBundle,但你也需要设置cron
答案 2 :(得分:-1)
在命令中使用&
将其发送到后台,如此
$command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob &'