如何在Laravel应用中查找Top10最慢GET/POST请求
Laravel 应用慢请求统计方案
针对Laravel应用全量请求的耗时统计、慢接口排查需求,有几类不同场景下的可用方案,从无侵入到自定义实现均覆盖:
1. 零依赖内置实现(生产/测试环境通用)
最稳妥的方式是自定义全局中间件做耗时统计,不需要安装额外包,数据完全可控:
- 执行命令生成中间件文件:
php artisan make:middleware RequestTimingMiddleware - 在中间件的handle方法里写入统计逻辑,核心代码如下:
public function handle($request, Closure $next) { $requestStart = microtime(true); $response = $next($request); $costMs = round((microtime(true) - $requestStart) * 1000, 2); // 仅过滤GET/POST请求,排除调试工具、系统内部路径 if (in_array($request->method(), ['GET', 'POST']) && !str_starts_with($request->path(), ['_debugbar', 'telescope', 'horizon'])) { // 数据可以写入专门的性能统计表,也可以打日志 \DB::table('request_performance')->insert([ 'method' => $request->method(), 'path' => $request->getPathInfo(), 'route' => optional($request->route())->getName(), 'cost_ms' => $costMs, 'ip' => $request->ip(), 'created_at' => now() ]); } return $response; }
- 把该中间件注册到
app/Http/Kernel.php的全局中间件数组中,所有请求就会自动触发统计。收集3-7天真实流量后,一条SQL就能查出最慢的10个请求:
SELECT method, path, route, AVG(cost_ms) as avg_cost, MAX(cost_ms) as max_cost FROM request_performance GROUP BY method, path ORDER BY avg_cost DESC LIMIT 10;
- 官方自带的Telescope工具也可以直接用,安装后自带请求监控面板,会自动记录每个请求的响应耗时、数据库查询、内存占用、调用链等信息,直接在面板按响应时间倒序就能筛选慢请求,适合测试、预发布环境快速排查,生产环境使用需要严格配置访问权限,避免敏感信息泄露。
2. 服务器层无侵入统计
如果不想修改应用代码,可以直接在Web服务器层做日志统计,数据会更贴近真实用户感知的全链路耗时:
- Nginx可以自定义日志格式,加入
$request_time字段,记录每个请求从接收到响应返回完成的总耗时,积累一定日志量后,用GoAccess或者简单的awk脚本就能统计出TOP10慢请求。 - Apache服务可以在日志格式中加入
%D字段,同样可以记录请求处理微秒级耗时,配合日志分析工具就能完成统计。
3. 开发环境快速排查
本地开发阶段可以直接装Debugbar或者Clockwork调试工具,每个请求的响应耗时、耗时拆分(数据库、视图、外部调用占比)会直接展示在调试栏,不用手动埋点就能快速定位明显的慢接口。
注意:不要仅用本地压测结果作为最终依据,本地环境的数据库负载、缓存命中率、网络延迟和生产环境差异极大,统计结果参考价值有限。如果需要做基准压测,可以用ab、wrk这类压测工具对单接口施压,拿到平均耗时、P95/P99耗时、QPS等数据,压测前务必确认环境,避免打挂线上服务。
内容的提问来源于stack exchange,提问作者Akshay Mohite
相关产品推荐
相关产品推荐

