TP6.0 巧用中间件实现接口请求耗时统计【性能监控】

老辰小哥_6659

老辰小哥_6659

2026-07-09

370人浏览

原创

最轻量可靠的埋点方式是在全局中间件中用 microtime(true) 计时,记录请求耗时、sql 执行时间并结构化日志,配合慢查询过滤、异步上报及响应头输出。

tp6.0 巧用中间件实现接口请求耗时统计【性能监控】

直接在中间件里用 microtime(true) 埋点,是最轻量、最可靠的方式——它覆盖所有请求路径(含异常 500、404),不依赖调试模式,也不干扰业务逻辑。

全局中间件统一计时

在 app/middleware.php 中注册自定义中间件类,例如 \app\middleware\TimingRecord::class。注意必须写完整命名空间路径,开头带反斜杠,且该文件中禁止使用 use 语句。

  • 中间件类的 handle() 方法接收 $request 和 $next
  • 开头调用 $start = microtime(true) 记录浮点秒级起始时间
  • 执行 $response = $next($request) 后,再算耗时:$cost_ms = round((microtime(true) - $start) * 1000, 2)
  • 用 think\facade\Log::info() 写结构化日志,包含 uri、method、status_code 和 cost_ms
  • 避免开启 app_debug = true,否则 Debugbar 等组件会额外引入 20–50ms 干扰

关联数据库查询细节

总耗时只是表象,SQL 往往占大头。单靠中间件无法拆解 DB 环节,需配合事件监听补全。

ThinkPHP5.1企业站点快速开发-源码课件
ThinkPHP5.1企业站点快速开发-源码课件

ThinkPHP5.1企业站点快速开发

下载
  • 在 app/provider/EventServiceProvider.php 的 listen 数组中添加:think\db\Events\Querying::class => [app\listener\LogQueryStart::class] 和 think\db\Events\Queried::class => [app\listener\LogQueryEnd::class]
  • 两个监听器分别记录查询发起与返回时刻,计算差值得到真实 SQL 执行毫秒数
  • 把 $sql、$params、$time、调用位置(debug_backtrace() 取前两层)一并写入独立日志通道(如 query_slow.log)
  • 别用 Db::getQueryTime(),它只返回最后一次查询耗时,无法绑定当前请求上下文

输出耗时到响应头(可选)

方便前端或网关快速感知,但要注意规范和性能影响。

  • 在中间件 handle() 末尾,给 $response 添加头:$response->header('X-Response-Time', sprintf('%.3f', $cost_ms))
  • 头名必须是 ASCII 字符,推荐标准命名 X-Response-Time 或 X-Process-Time
  • 值保留 3 位小数(单位毫秒),避免超长或非数字字符引发代理拦截
  • 确保该中间件注册顺序早于 Gzip、CORS 等可能修改响应头的中间件

慢请求过滤与上报

高频接口(如健康检查)无需全量统计,高耗时才值得记录和告警。

  • 对 /health、/ping 等路径做白名单跳过:if (stripos($request->url(), '/health') === 0) { return $next($request); }
  • 只对 $cost_ms > 1000 的请求打 Log::warning(),避免日志爆炸
  • 上报行为必须异步:用 think\facade\Queue 推送至消息队列,或交由 Swoole 定时任务批量处理,严禁同步 HTTP 上报
  • 慢查阈值建议按业务动态设定(如核心订单接口设 300ms,后台报表设 3000ms)

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

thinkphp

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

589

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

604

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

418

17

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4529

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3709

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

406

15

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 2.5万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.5万人学习