【发布时间】:2019-02-22 05:39:52
【问题描述】:
有没有更丑陋的方法来做到这一点:
ignore_user_abort(true);
set_time_limit(0);
ob_start();
echo $response; // send the response
header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();
在 Laravel 中?基本上我需要服务器在运行事件之前向用户返回响应,我不能使用队列来执行此操作,因为要完成很多事情,并且很多客户端同时执行此操作,而这些事情需要完成瞬间,所以不能一一执行。这些事件包括发送邮件、警报、更新网站表格上的数据等。
【问题讨论】:
-
您的反应如何?通过 API/Web/控制台?多提供一点上下文。顺便说一句,要在完成任务之前回复用户,请使用Queued Jobs。这样,您可以在服务器在后台处理您的工作时继续做您的事情(例如发送电子邮件、延迟操作)。
-
您能否就您要解决的问题提供一些背景信息?从标题中我可能会建议可终止的中间件或排队的作业,但从问题中不清楚您要实现什么。 (另外,标头总是需要在响应正文之前发送)
-
@TravisBritz Terminable Middleware 是一个选项,我将确切搜索它是如何工作的。但客户端不能等待所有这些事情,我也不能把它放在 com 队列中,因为它会每 1 次完成,但我需要这些脚本同时在服务器上运行多次。
-
你真的在使用 Laravel 的内置事件调度器吗?如果是这样,你也可以将
implements ShouldQueue添加到你的事件监听器类中,Laravel 将自动使用作业队列而不是立即运行监听器。 -
是的,我读过这个问题。 “我不能使用队列”并不具体;为什么某些操作(例如发送电子邮件和警报)不能排队?实现事件/侦听器系统的方法有很多,但是已经探索和排除了哪些选项?您的事件是否有多个侦听器,是否可以将特定的侦听器排队?我只是想更好地了解您的系统的结构,因为一如既往,答案是“视情况而定”。
标签: laravel laravel-5 laravel-5.4 laravel-5.5