我目前正在处理一个Symfony 6.1项目,有一个数据库插入需要生成相当多的条目(30 k+)。我想将此插入过程作为后台任务运行,一旦所有条目都在数据库中创建,我想发送一封电子邮件。
现在,我在Symfony文档中找到了以下关于后台任务的文章:https://symfony.com/doc/current/components/process.html#running-processes-asynchronously
但是,我不太明白如何让进程在后台运行。
我的当前代码:
$process = new Process(); //not sure what to put in for the constructor
$process->start(function ($data) {
foreach($data as $key => $value) {
$value->setExampleValue("example");
$this->entityManager->persist($value);
$this->entityManager->flush();
}
... email code
});
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
更新日期:
有人注意到我已经看过Symfony的命令了。现在我试着启动我的自定义命令作为一个进程。但是每次我启动命令都失败了,退出代码是:().代码如下:
$process = new Process(['php bin\console app:generate-test']);
//$process->setWorkingDirectory(substr(getcwd(), 0, strrpos(getcwd(), '/')));
$process->start();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
然而,如果我通过控制台启动命令“php bin/console app:generate-test”,它就可以工作,并且我会在控制台窗口中打印一个简单的文本行。
有人知道我做错了什么吗?
最终解决方案:
我没有使用Symfony的Process组件,而是按照评论中的建议切换到Messenger组件。
现在这个工作就像一个魅力!
我发现了一个很棒的教程系列,用于理解和实现信使:https://www.youtube.com/watch?v=Xwn_BNfyjgk
1条答案
按热度按时间a2mppw5e1#
我认为您应该查看命令(https://symfony.com/doc/current/console.html)
然后,您可以运行该命令并最小化控制台窗口,或者使用进程管理器(如Supervisor)在后台运行该命令。