我有一个symfony应用程序,需要异步发送电子邮件。当我的用户执行某些操作时,我需要向管理员发送电子邮件。为此,我创建了一个symfony自定义命令,用于Symfony流程组件,它类似于php本机的exec()。我的代码如下:
if ($trigger == true) {
$command = 'php bin/console async-email';
$process = new Process([$command]);
$process->start();
$pid = $process->getPid();
}根据官方文件,这应该是足够的,但我可以确认电子邮件没有发送。但是,当我要威胁等待命令结束(如not异步)并打印结果时,命令工作得很好,电子邮件就会发送。
$process->wait(function ($type, $buffer) use ($data) {
// do stuff
});
return new JsonResponse([$process->getErrorOutput(), $process->getOutput(), $pid]);我也试过:
inside.
自定义php脚本的批处理文件。
任何方法都可以工作,但不是异步的。我需要的是命令在后台执行操作,而不干扰正常的代码执行。
发布于 2021-04-15 12:16:15
首先,如果您从主进程启动某个异步进程,则需要等到所有异步进程在结束主进程之前完成。在另一种情况下,当主进程被关闭时,所有异步子进程都会在任务结束之前被终止。这是任何应用程序的一般规则。
因此,如果不希望等待发送的电子邮件,请将邮件添加到队列中,并完成主请求。然后从php bin/console async-email运行corn,即每5分钟运行一次。这是异步的。
但是IMHO,如果用户在执行了一些(不是所有的)操作后发送单个电子邮件,那么从控制器动作同步发送这封电子邮件是完全可以的。
发布于 2021-04-16 17:48:44
您对symfony流程组件行为@Łukasz的看法是100%正确的。您可以运行n个异步子进程(互操作),但它们依赖于主进程,因此,如果不等待或检查完成,它们在主执行结束时就会被杀死。
我还没有完全理解异步和背景之间的区别。因此,在Julien B.上面的回复之后,我意识到一个quequing系统是我所需要的,所以我花了12个小时重构我的代码,使用带有教义传输和voilá的symfony信使,工作起来就像一种魅力!
将来可能需要看一个更先进的quequing系统,比如RabbitMQ,它允许动态异步queques。
现在我的问题已经解决了,更重要的是我走上了正确的方向,非常感谢!
https://stackoverflow.com/questions/67099066
复制相似问题