【发布时间】:2021-08-06 14:19:41
【问题描述】:
我想在 Laravel 中尽早关闭连接,我发现了问题:
How do I close a connection early?
答案是:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
但是 echo 在 Laravel Controller 中不起作用,当我更改为 return 时,后面的代码不会执行。
[更新]
我的问题是:
我有一个耗时的任务需要调用 python 脚本。此任务可能需要 30 到 180 秒。如果我使用 Laravel 中的定时任务或者系统的 Conrtab 定时任务,最糟糕的可能是 Python 脚本只能在 1 分钟后运行。这会让用户多等一分钟,用户体验不是很好。
所以希望早点结束连接,让用户先看到响应,同时调用Python脚本进行任务处理。
目前我使用了两个ajax请求来解决这个问题,其中一个是用来调用python脚本的。
我的问题是知道是否可以在没有额外请求的情况下实现相同的目标,或者是否有更好的解决方案。
【问题讨论】:
-
Aghrrr....该代码不是 laravel'sk,您应该使用队列和作业来解决您的问题,并在异步代码完成后获取数据。
-
@mrhn 非常感谢,不过想知道用 Laravel 能不能解决
-
不久前的一个答案。它是关于 php-cli 的,对于企业风格的编码来说可能有点脏,但它确实工作得很好,这永远不会引起问题。其实最简单直接的方法,见解释stackoverflow.com/a/57697076/2494754
-
队列和作业是 laravel 的概念,我可以举个例子,但我需要更多的上下文来解决这个问题。你想让我做什么? Tbh,您提供的代码对于 laravel 应用程序来说非常糟糕,不应该那样实现。
-
fastcgi_finish_request() 完成了这项工作。您可能不应该自己调用它。您可以添加一个中间件并将耗时的任务放在 terminate() 函数中。您也可以考虑使用队列和作业。