最直接准确的PHP请求耗时统计方式是用microtime(true)在脚本开头和结尾各取一次时间戳并相减,单位为秒、精度达微秒;避免使用time()或Web服务器日志字段,因其精度不足或包含非PHP执行时间。
用 microtime(true) 记录 PHP 请求耗时最直接
PHP 原生没有自动记录单次请求耗时的开关,得自己埋点。最可靠、开销最小的方式就是用 microtime(true) 获取浮点秒级时间戳,在脚本开头和结尾各调一次,相减即得真实耗时(单位:秒,精度到微秒)。
注意别用 time() ——它只精确到秒,对监控没意义;也别依赖 Apache 或 Nginx 的日志字段(如 %D),它们统计的是整个 HTTP 生命周期,包含网络传输、队列等待等,不是 PHP 实际执行时间。
- 开头记录:
$start = microtime(true); - 结尾计算:
$elapsed = microtime(true) - $start; - 建议在
index.php入口最顶部写$start,在所有逻辑跑完、响应发出前(比如echo或exit前)算$elapsed
把耗时写进日志或监控系统要注意格式和性能
直接 error_log("req_time: {$elapsed}s"); 很简单,但高频请求下频繁 IO 会拖慢响应。更稳妥的做法是:先拼好日志字符串,再统一写入(比如用 file_put_contents(..., FILE_APPEND | LOCK_EX)),或走异步通道(如 syslog、UDP 发给 StatsD / Prometheus Pushgateway)。
如果用 Monolog 等日志库,记得加 extra 字段传耗时,别塞进 message 主体里——否则后续用 ELK 或 Loki 做聚合分析会很麻烦。
立即学习“PHP免费学习笔记(深入)”;
- 推荐日志字段名:
duration_ms(单位毫秒,整数,方便排序和告警阈值设置) - 避免写成:
"耗时:0.123456 秒"这类带单位、空格、中文的字符串 - 若用
$_SERVER['REQUEST_URI']记录路径,记得过滤敏感参数(如token=xxx),防止日志泄露
CLI 脚本和 Web 请求的耗时统计逻辑要分开处理
Web 请求有明确生命周期(从接收请求到发送响应),而 CLI 脚本可能长期运行、多任务并行。不能直接复用同一套计时逻辑。