microtime() 默认返回字符串,需用 microtime(true) 获取浮点秒数;计时点须紧贴 query 执行前后,避开 prepare/fetch;注意查询缓存干扰,生产环境优先用慢查询日志。

microtime() 返回值类型必须手动转换
microtime() 默认返回字符串(如 "0.12345678 1712345678"),直接相减会出错。PHP 不会自动解析成浮点数,常见错误是得到 0 或 NaN。
- 务必用
microtime(true)获取浮点秒数(带微秒精度),这是最简可靠的写法 - 若只能用默认形式,需用
explode(' ', microtime())拆分后拼接再转floatval(),但没必要绕弯 - 注意时区和系统时钟不影响耗时统计,
microtime()是单调递增的底层时钟调用
统计位置必须紧贴 query 执行前后
在 PDO 或 MySQLi 中,不能把计时点放在 prepare 阶段或 fetch 阶段——那统计的是整段逻辑耗时,不是 SQL 实际执行时间。
- 正确位置:在
$pdo->query()或$stmt->execute()调用的正前方和正后方 - 如果用了预处理+绑定参数,计时范围应覆盖
execute(),因为参数绑定开销极小,真正耗时在服务端执行 - 避免包含网络往返(如长连接慢、DNS 解析)干扰判断;若怀疑是网络问题,应在 MySQL 服务端用
SHOW PROFILES对照验证
注意 MySQL 的查询缓存与连接复用干扰
本地测试时反复执行同一条 SQL,可能命中 MySQL 查询缓存(尤其旧版本),导致 microtime 显示耗时极低(如 0.0001s),但这不代表真实性能。
- 测试前加
SELECT SQL_NO_CACHE ...或执行RESET QUERY CACHE(MySQL 8.0 已移除,需确认版本) - 使用短连接(
PDO::ATTR_PERSISTENT => false)避免连接池中复用已缓存结果 - 生产环境更应关注慢查询日志(
slow_query_log=ON+long_query_time)而非单次microtime,后者适合定位某次异常毛刺
简单封装成可复用的执行器函数
硬编码两处 microtime(true) 容易漏或写反,建议抽成小函数,同时兼容 PDO 和原生 MySQLi。
function timedQuery($pdo, $sql, $params = []) {
$start = microtime(true);
$stmt = $pdo->prepare($sql);
$result = $stmt->execute($params);
$end = microtime(true);
$duration = round(($end - $start) * 1000, 2); // 毫秒,保留两位
error_log("SQL: {$sql} | Time: {$duration}ms");
return $result ? $stmt : false;
}
注意:$duration 小于 0.1ms 时可能显示为 0.00,这不是误差,而是 microtime 在某些系统上实际精度约 1–10ms;真要测亚毫秒级,得用 hrtime()(PHP 7.3+)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











