Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 脚本结束后是否运行Symfony2后台进程?_Php_Symfony_Background Process - Fatal编程技术网

Php 脚本结束后是否运行Symfony2后台进程?

Php 脚本结束后是否运行Symfony2后台进程?,php,symfony,background-process,Php,Symfony,Background Process,符号狂人 假设我的控制器中有以下代码: for ($i = 0; $i <= 3; $i++) { $command = 'php ' . $kernel->getRootDir() . '/console Educa:ExecuteJob ' . $i . ' --env=' . $kernel->getEnvironment();

符号狂人

假设我的控制器中有以下代码:

        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(...);
for($i=0;$i getRootDir()。/console-Educa:ExecuteJob'
.$i'.--env='.$kernel->getEnvironment();
$logger->addInfo(“执行命令:”.$command);
$process=新进程($command);
$process->disableOutput();
$process->start();
}
//睡眠(5);
返回$this->render(…);
执行ExecuteJob大约需要5秒钟,在控制台命令中,我在开始和结束脚本中都有一个logger->addInfo()

如果我取消对sleep(5)行的注释,它们都会打印。如果我没有取消注释,日志中只打印初始行,这一定意味着当控制器脚本结束时,它会停止所有进程,我错了吗

有什么办法可以解决这个问题吗?我愿意改变设计,我只想在不必等待呈现页面的情况下执行背景内容(甚至与该页面无关)


PS:我正在寻找一种运行后台任务的方法,该任务在Symfony2上运行得很好,而不是奇怪的php黑客或cron作业。我知道这些。我也不想设置MQ队列。这对于我正在尝试的任务来说有点过火。

在您的情况下,完美的解决方案是使用,它是在响应流化后触发的你需要这样的东西,但是你也需要设置cron,使用命令中的
&
将它发送到后台,如下所示

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

我只是回答我自己说我读过这篇文章,但我不确定这是一个好的做法,还是一个我将永远后悔的潜在痛苦的混乱来源。@DanielParejoMuñoz这取决于你想做什么。如果是一个小操作kernel.terminate就很好了。如果你想做需要多次的非常繁重的操作处理时间考虑cron之类的东西。所以让我们假设它是轻量级的。我如何将它分配给控制器?我的意思是,在这里的示例中,你可以看到它将它附加到每个kernel.exception事件。我不希望这样。我希望这段代码只在“邀请控制器”终止时执行(理想情况下,当他的一个方法终止时)。有没有更具体的方法?@DanielParejoMuñoz您可以拥有某种消息/事件池,您可以在内核上处理。当您需要运行后期处理时,终止并将消息放入池中。没有。谢谢,但是,正如我所说,没有cron。首先,cron中的树不是跨平台的;您可能无法控制服务器设置了一个cron和…第三个原因。所以没有cron。有人能解释一下这种方法的错误吗?