在symfony中执行长时间的后台进程

时间:2017-09-07 22:34:26

标签: php symfony

我很长时间都在阅读如何解决我的问题,但我找不到解决方案。

我正在使用symfony,当用户调用一个动作时,我需要很长时间才能执行。请求完成后我可以处理数据吗?目的是使用jQuery从客户端启动一个轮询进程,并等待进程完成以重定向到另一个操作。

现在,我正在使用ContainerAwareCommand,但它会等到后台进程完成。

拜托,你能帮助我吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

是的,在将响应发送给用户后,可以在Symfony中执行一些后台处理。

您需要为kernel.terminate事件编写一个监听器。 并在回调中定义长时间运行的进程。

请注意以下几点:

  • 如果以编码的 gzip 格式发送Response,则此技术不起作用。因此,您应该强制apache / nginx不要将 gzip 用于此特定响应。
  • 在此请求期间设置任何会话数据非常复杂,因为只有在长时间运行的进程完成后才会设置会话。这意味着,您需要找到flashbag消息的替代方案。

答案 1 :(得分:0)

对于队列,例如RabbitMQ或Redis,这是一个很好的例子。在上传每个文件时将消息放入队列。一个或多个PHP daemons读出队列,处理每个文件,并更新用户的状态(例如,更新数据库中的行)。

这使您可以在与Web请求分开的服务器上运行处理并轻松扩展。如果你需要做什么允许,你可以使用队列将处理分解为多个并发任务。