Php Symfony内核事件与自定义事件

Php Symfony内核事件与自定义事件,php,symfony,Php,Symfony,在我的控制器响应后,我必须做一些工作。最好使用什么: 1.侦听kernel.terminate事件 或 2.发送我的自定义事件 ? 为什么内核终止 如您所见,通过调用$kernel->terminate发送 响应时,您将触发kernel.terminate事件 执行您可能延迟的某些操作以返回 尽快向客户端发送响应(例如发送 电子邮件) 但另一方面,检查我的订阅服务器中的每个请求可以吗?如果不使用内核,您将无法让自己的事件在响应后工作。终止。因为这是响应之后可能发生的唯一操作。我们可以通过查看前端

在我的控制器响应后,我必须做一些工作。最好使用什么: 1.侦听kernel.terminate事件 或 2.发送我的自定义事件 ?

为什么内核终止

如您所见,通过调用$kernel->terminate发送 响应时,您将触发kernel.terminate事件 执行您可能延迟的某些操作以返回 尽快向客户端发送响应(例如发送 电子邮件)


但另一方面,检查我的订阅服务器中的每个请求可以吗?

如果不使用
内核,您将无法让自己的事件在响应后工作。终止
。因为这是响应之后可能发生的唯一操作。我们可以通过查看前端控制器
app.php
来确认这一点:

$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
请注意,kernel.terminate将起作用。否则,除了使用一些消息队列之外,没有其他解决方案

最后,一种常见的模式是在
内核上动态添加侦听器。从控制器内部,假设您需要调用
my\u服务

$myService = $this->get('my_service');

$this->get('event_dispatcher')->addListener('kernel.terminate', function (Event $event) use (myService) {
     $myService->doSomething();
});

kernel.terminate
在发送响应后发生,对于客户端收到响应后可以执行的一些“繁重”操作非常有用。但也有一些缺点,主要是如果出现问题,无法向用户提供适当的反馈(例如重试或报告问题)。此外,并非所有错误都会被记录(请参阅)


由于您希望将作业发布到Gearman队列,我建议您避免使用
内核.terminate
,因为发布作业通常不涉及大量资源,并且应该可以在发送响应之前执行。因此,您可以触发自定义事件,或者甚至可以通过在控制器中执行更显式的调用来完全避免事件调度程序。

这取决于您实际执行的操作。Gerry,我必须这样做才能将消息发送到Gearman队列。对我来说,理想情况是使用subscribe on kernel.terminate事件,但我犹豫不决,倾听每一个请求是否好?我明白了。无论何时分派事件,我都可以在保存到db后执行。但当我使用kernel.terminate时,脚本不会等待事件工作完成。另一方面,正如我已经说过的,倾听每一个请求是否很好?您想要的是什么同步事件?然后,您可以使用kernel.response.exe,从技术上讲,您可以在kernel.terminate侦听器中触发自定义事件。