我创建了一个向Google Analytics发送请求的terminable middleware。我发送的一个属性是服务器响应时间。以下是我的表现方式:
在\App\Http\Kernel
中,我添加了SendAnalytics
中间件:
class Kernel extends HttpKernel {
...
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
...
'App\Http\Middleware\SendAnalytics',
];
}
SendAnalytics
中间件看起来像:
class SendAnalytics implements TerminableMiddleware {
protected $startTime;
public function __construct() {
$this->startTime = microtime(true);
}
public function handle($request, Closure $next) {
return $next($request);
}
public function terminate($request, $response) {
$responseTime = microtime(true) - $this->startTime;
/* I send a request to Google here, using their Measurement Protocol */
// Dying for debugging purposes
dd($responseTime); // Always prints 0.0
}
}
但这总是显示0.0
。显示服务器响应时间的正确方法是什么?
答案 0 :(得分:13)
我使用了microtime(true) - LARAVEL_START
。似乎给出了相当准确的响应时间。
正如波格丹在评论中提到的那样:
LARAVEL_START
常量在bootstrap/autoload.php
中定义 是public/index.php
中包含的第一个文件,因此这样做 这是第一个要执行的陈述。如果你放置中间件 在列表的最后,它的terminate方法将是最后执行的方法 在调用app->terminate()
之前,你应该得到一个漂亮的 良好的执行时间计算。
答案 1 :(得分:0)
我注意到在单个请求中,生命周期中间件实例可能会被多次初始化。第二次就在terminate
召唤之前。这可以解释零时间结果(在我的机器上它不是零而是非常接近它,而实际请求时间更像是200ms)。 handle
方法显然只被调用一次,这是必须记录开始时间的地方。
class SendAnalytics implements TerminableMiddleware {
protected $startTime;
public function handle($request, Closure $next) {
$this->startTime = microtime(true);
return $next($request);
}
...
}