我使用 postman 查询我的 laravel API,并且在 postman 收到结果之前调用中间件中的终止方法:
路线
Route::any('/lookup', 'LookupController@lookup')->name('lookup')->middleware(\App\Http\Middleware\LogRequest::class);
中间件
namespace App\Http\Middleware;
use Closure;
class LogRequest
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
sleep(10);
}
}
当我删除
sleep(10);
时,响应会提前 10 秒到达,因此我确信服务器在实际返回响应之前会等待终止完成。
您需要有 FastCGI 才能工作,fastcgi_finish_request() 函数必须可用。我对 Laravel Sail 也有同样的问题
运行可终止中间件需要 PHP 的 fastcgi_finish_request() 函数,该函数会关闭与客户端的连接,同时保持 PHP 工作线程可完成请求(即执行 Terminate() 方法中的代码)。