直接调用 microtime(true) 获取秒级浮点时间戳,乘以 1000 并取整即得毫秒时间戳:(int)(microtime(true) * 1000);time() 仅支持秒级精度,无法获取真实毫秒。

PHP怎么用microtime()获取毫秒时间戳
直接调用 microtime(true),它返回带小数的浮点数,单位是秒,小数部分精确到微秒(即 1/1000000 秒),乘以 1000 就是毫秒级时间戳。
注意:不要用 microtime(false)(默认行为),它返回字符串如 "0.12345600 1712345678",需要手动拆分拼接,容易出错且不直观。
-
microtime(true)是最简、最可靠的方式,PHP 5.1.0+ 均支持 - 结果是浮点数,比如
1712345678.123456,乘以 1000 后取整可得毫秒整数:(int)(microtime(true) * 1000) - 如果只要当前毫秒值(不关心秒数),用
(int)(microtime(true) * 1000) % 1000提取毫秒部分(0–999)
为什么time()不能输出毫秒
time() 只返回整数秒时间戳,精度就是 1 秒。它底层调用系统 time() 系统调用,天然不支持毫秒。强行在后面拼 "000" 或补零(如 time() . '000')得到的是“伪毫秒”,所有请求在同一秒内都会一模一样,完全无法区分先后。
- 常见误写:
time() * 1000—— 这只是把秒数放大 1000 倍,不是真实毫秒,同一秒内所有值都相同 - 毫秒必须依赖更高精度的时钟源,
microtime()底层用gettimeofday()或clock_gettime(CLOCK_MONOTONIC),才能拿到微秒级数据 - Windows 下 PHP 7.3+ 对
microtime(true)的精度也足够稳定,无需额外处理
输出格式化毫秒时间(年月日时分秒+毫秒)
PHP 没有内置格式符直接输出毫秒,得手动拼接。关键是先用 date() 生成秒级时间字符串,再从 microtime(true) 提取毫秒部分补在后面。
$ms = (int)(microtime(true) * 1000) % 1000;
echo date('Y-m-d H:i:s') . '.' . str_pad($ms, 3, '0', STR_PAD_LEFT);
输出类似:2024-04-05 14:23:18.123
- 别用
date('u')—— 它返回的是微秒(6 位),而且是当前秒内的微秒数,但date()函数本身不保证与microtime()同一时刻采样,存在微小偏差(尤其高并发下) -
str_pad($ms, 3, '0', STR_PAD_LEFT)确保毫秒恒为 3 位(如 5 →"005"),避免日志对齐混乱 - 如果要兼容更老版本 PHP(microtime(false) 字符串解析,但没必要——PHP 5.1 是 2004 年发布的,现代环境基本无须考虑
毫秒时间在日志和性能统计中的典型用法
真正实用的不是“显示毫秒”,而是“计算耗时”。关键在于起始和结束都用 microtime(true),相减后乘 1000 得到毫秒级耗时。
$start = microtime(true); // ... 执行一段逻辑 $end = microtime(true); $cost_ms = round(($end - $start) * 1000, 2); // 保留两位小数,单位毫秒
常见坑:
- 用
time()做起点、microtime(true)做终点?相减结果毫无意义,单位都不一致 - 忘记
round()或强制类型转换,导致浮点误差(如0.000000123456789秒变成0.123456789毫秒,显示成0.12更合理) - 在 CLI 脚本中测试时,注意系统负载或 CPU 频率调节可能影响单次测量;多次运行取平均更可信
毫秒精度本身没问题,但真正难的是让两次 microtime(true) 调用之间不被其他操作干扰——比如日志写入、网络 I/O、GC 触发,这些都会混入测量结果里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











