【问题标题】:Symfony Return Response and then do Heavy JobSymfony 返回响应然后做繁重的工作
【发布时间】:2021-02-23 20:02:38
【问题描述】:

在 Symfony 5 上,我有一个控制器,它调用一个执行繁重工作的服务,它根据用户输入的内容更新数据库中的行。

如果用户输入一千行我想return 一个JsonResponse 给用户,然后做繁重的工作并发送电子邮件。

我已尝试根据this将此添加到我的服务中

if($isHeavyJob) {
             $email = $this->request->get("email");
             $this->eventDispatcher->addListener(KernelEvents::TERMINATE, function (Event $event) use ($userEmail) {
                    $this->runJob($userEmail);
                });
             return new JsonResponse(['message' => 'Is a Heavy Job, wait a response via email.'], 200);
}
$data = $this->runJob();
return new JsonResponse(['message' => 'Not a heavy job so here is your data.', 'data' => $data], 200);

但我得到了

Uncaught Error: Argument 1 passed to App\Service\HeavyJob::App\Service\HeavyJob{closure}() must be an instance of Symfony\Component\EventDispatcher\Event

我需要创建一个单独的事件吗?

【问题讨论】:

  • 您应该查看Symfony Messenger,更具体地说是async queued messages。它允许您发送“消息”(其中包含数据的 php 对象),例如使用要更改的数据,然后您可以使用提供的命令在处理程序中处理它们(这基本上是您调用繁重工作的地方)。
  • 从回调中移除 Event 类型提示。你到达那里的类型错误。 var_dump 来搞清楚什么是类型,是吗。

标签: symfony events service dispatch symfony5


【解决方案1】:

想想你可能会失去一致性。如果您响应用户并且在完成繁重的工作之后,该工作可能会失败并且无法完成。 正如@dbrumann 提到的,最好使用Messaging System。如果失败,您可以重试您的工作。如果您编写允许失败者的代码,您可以确定它会成功完成。

【讨论】:

  • 是的,我认为每次发生这种情况时 nginx 和 php 都会超时
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
相关资源
最近更新 更多