microtime() 默认返回字符串,必须传 true 才得可计算的浮点数;测量执行时间应始终用 microtime(true),否则隐式转换导致结果错误;php 7.3+ 推荐 hrtime() 替代。

microtime() 默认返回字符串,传 true 才得到可直接计算的浮点数——这是最常被忽略的前提,不加 true 就直接减法,结果是错的。
microtime(true) 是计时唯一靠谱用法
测量代码执行时间必须用 microtime(true),否则拿到的是字符串,比如 "0.123456 1715823456",直接相减会触发 PHP 的隐式类型转换,把前面的微秒部分当 0 处理,导致时间差恒为 0 或严重失真。
- 开始和结束都用
microtime(true),相减即得秒级带微秒精度的耗时 - 别在循环里高频调用——它底层依赖系统
gettimeofday(),开销比time()大,PHP 7.3+ 推荐用hrtime()替代 - 浮点数精度在 PHP 中是双精度,微秒级误差基本可忽略,但不要拿它做严格相等判断(比如
==),用或容差比较
microtime() 不带参数时返回什么
不传参或传 false,返回形如 "0.12345600 1715823456" 的字符串,空格分隔两段:前段是“当前秒内的微秒数(以秒为单位的小数)”,后段是 Unix 秒数。两段都是秒量纲,不是“微秒整数”。
- 想手动解析?得
explode(' ', microtime())再分别取[0]和[1],然后加总:$parts[1] + $parts[0] - 这种写法易出错:空格可能因环境变化、PHP 版本差异多一个或少一个;小数位数不固定(有的系统返回 6 位,有的 7 位)
- 除非你明确需要兼容极老 PHP 版本(true 参数
生成毫秒时间戳要小心四舍五入
前端 JS 的 Date.now() 返回毫秒整数,PHP 要对齐就得把 microtime(true) 换算成毫秒整数,但不能简单 (int) 强转。
- 正确做法:
(int) round(microtime(true) * 1000)—— 先乘再四舍五入,避免截断损失最多 0.999 毫秒 - 错误写法:
(int) (microtime(true) * 1000),因为浮点乘法可能产生类似1715823456789.999的值,(int)直接截断变1715823456789,丢掉几乎整整 1 毫秒 - 存数据库或传 JSON 前务必确认类型:MySQL 的
DATETIME(3)要接收带小数点的秒级浮点数,而BIGINT字段适合存 13 位毫秒整数
注意系统兼容性和替代方案
microtime() 依赖操作系统是否支持 gettimeofday() 系统调用,在某些嵌入式或精简版 Linux(如 Alpine 的 musl libc)上可能不可用或返回恒定值。
- 检查可用性:
function_exists('microtime')只能判断函数是否存在,不能保证精度有效;真要验证,得对比多次调用是否变化 - PHP 7.3+ 更推荐
hrtime():返回纳秒级整数数组,无浮点误差,且不依赖gettimeofday(),但注意它返回的是相对启动时间,不是 Unix 时间戳 - 若需绝对时间 + 高精度,
microtime(true)仍是目前最通用的选择,只是得接受它在某些容器环境里精度退化到毫秒级
真正容易踩的坑不在语法,而在默认返回字符串这个设计——很多人抄了示例却漏掉 true,测出来的时间永远是 0,然后花半天查逻辑错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











