在Laravel中获取服务器响应时间的正确方法

时间:2015-07-24 20:35:27

标签: php laravel laravel-5

我创建了一个向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。显示服务器响应时间的正确方法是什么?

2 个答案:

答案 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);
    }
    ...
}