Laravel 的中间件有一个叫做 terminate 的方法,如果我们实现了该方法,那么在 Laravel 整个生命周期执行快要结束的时候,Laravel 就会执行这个方法,方法结构如下:

public function terminate($request, $response)
    {
    }

它有两个参数,一个是 $request ,另外一个是 $response 。也就是本次请求的参数和响应值了。我们可以利用这个方法来记录API的处理时间和请求参数,响应值。

这里,我们定义一个中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use App\Models\ApiResponseRecord;

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

    public function terminate($request, $response)
    {
        $startTime = LARAVEL_START * 10000;
        $endTime = microtime(true) * 10000;
        ApiResponseRecord::create([
            'api' => parse_url($request->url())['path'] ?? '',
            'input' => json_encode($request->input()),
            'response' => $response->getContent(),
            'start_time' => $startTime,
            'end_time' => $endTime,
            'handle_time' => $endTime - $startTime,
        ]);
    }
}

在 Laravel 的 public/index.php 定义了 LARAVEL_START 常量,记录了 Laravel 启动的时候的微秒,我们可以利用这个来计算整个请求所处理的时长。