gpt4 book ai didi

laravel - 如何在 Laravel 5 中正确使用可终止中间件?

转载 作者:行者123 更新时间:2023-12-02 21:03:03 25 4
gpt4 key购买 nike

我正在 Laravel 5 中试验 TerminableMiddleware,尝试理解它,看看在 HTTP 请求得到答复后可以实现什么。我的想法是:

http://php.net/manual/en/function.fastcgi-finish-request.php

尽管我在这里进行了测试,但我可以看到请求一直保持打开状态,直到终止程序完成。我的想法是它会发送响应并关闭连接。或者它是否依赖于安装的 fastcgi_finish_request() ?

我是否试图以错误的方式使用它?

<?php namespace App\Http\Middleware;

use Illuminate\Contracts\Routing\TerminableMiddleware;

use Closure;

class MyTestMiddleware implements TerminableMiddleware {


/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);

$response->setContent("OK " . time());

return $response;
}

public function terminate($request, $response)
{

$fp = fopen('/tmp/deleteme', "w");

for ($i = 0; $i < 100000 ; $i++)
{
fputs($fp, $this->generateRandomString(400) . "\n");
}

fclose($fp);
}

private function generateRandomString($length = 10)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++)
{
$randomString .= $characters[rand(0, $charactersLength - 1)];
}

return $randomString;
}
}

最佳答案

terminate() 方法在 public/index.php 文件末尾调用:

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

$response 对象是 Symfony\Component\HttpFoundation\Response 的一个实例,当前 send() 方法的实现是:

public function send()
{
$this->sendHeaders();
$this->sendContent();

if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} elseif ('cli' !== PHP_SAPI) {
static::closeOutputBuffers(0, true);
}

return $this;
}

所以答案是肯定的,它依赖于安装的 fastcgi_finish_request 。事实上,它会尝试调用它(如果存在)。如果没有,它只会输出您的响应内容并在连接打开时运行 Terminate() 方法。

如果你需要在连接关闭后做一些更重的事情,你应该使用 Laravel 的 Queues 来实现它反而。

关于laravel - 如何在 Laravel 5 中正确使用可终止中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29887624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com