首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法执行异步操作/命令

无法执行异步操作/命令
EN

Stack Overflow用户
提问于 2021-04-14 21:01:51
回答 2查看 84关注 0票数 0

我有一个symfony应用程序,需要异步发送电子邮件。当我的用户执行某些操作时,我需要向管理员发送电子邮件。为此,我创建了一个symfony自定义命令,用于Symfony流程组件,它类似于php本机的exec()。我的代码如下:

代码语言:javascript
复制
    if ($trigger == true) {
        $command = 'php bin/console async-email';
        $process = new Process([$command]);
        $process->start();
        $pid = $process->getPid();
    }

根据官方文件,这应该是足够的,但我可以确认电子邮件没有发送。但是,当我要威胁等待命令结束(如not异步)并打印结果时,命令工作得很好,电子邮件就会发送。

代码语言:javascript
复制
        $process->wait(function ($type, $buffer) use ($data) {
        // do stuff
        });

        return new JsonResponse([$process->getErrorOutput(), $process->getOutput(), $pid]);

我也试过:

inside.

  • Running

  • 在进程中创建了一个带有命令

自定义php脚本的批处理文件。

任何方法都可以工作,但不是异步的。我需要的是命令在后台执行操作,而不干扰正常的代码执行。

EN

回答 2

Stack Overflow用户

发布于 2021-04-15 12:16:15

首先,如果您从主进程启动某个异步进程,则需要等到所有异步进程在结束主进程之前完成。在另一种情况下,当主进程被关闭时,所有异步子进程都会在任务结束之前被终止。这是任何应用程序的一般规则。

因此,如果不希望等待发送的电子邮件,请将邮件添加到队列中,并完成主请求。然后从php bin/console async-email运行corn,即每5分钟运行一次。这是异步的。

但是IMHO,如果用户在执行了一些(不是所有的)操作后发送单个电子邮件,那么从控制器动作同步发送这封电子邮件是完全可以的。

票数 1
EN

Stack Overflow用户

发布于 2021-04-16 17:48:44

您对symfony流程组件行为@Łukasz的看法是100%正确的。您可以运行n个异步子进程(互操作),但它们依赖于主进程,因此,如果不等待或检查完成,它们在主执行结束时就会被杀死。

我还没有完全理解异步和背景之间的区别。因此,在Julien B.上面的回复之后,我意识到一个quequing系统是我所需要的,所以我花了12个小时重构我的代码,使用带有教义传输和voilá的symfony信使,工作起来就像一种魅力!

将来可能需要看一个更先进的quequing系统,比如RabbitMQ,它允许动态异步queques。

现在我的问题已经解决了,更重要的是我走上了正确的方向,非常感谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67099066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档