time() 返回秒级整数,microtime() 返回微秒级浮点数或字符串,两者均基于 unix 纪元,但精度、类型及适用场景迥异:time() 适合粗粒度时间判断,microtime(true) 才适用于高精度计时。

time() 返回秒级整数,microtime() 返回微秒级浮点数或字符串
两者都基于 Unix 纪元(1970-01-01 00:00:00 GMT),但精度和返回类型完全不同。time() 直接返回一个整数,比如 1725108955;microtime() 默认返回形如 "0.12345600 1725108955" 的字符串,加 true 参数才返回浮点数 1725108955.123456。别直接拿默认字符串做减法——它不是数字,强制转 float 会多一次解析开销,还可能因 locale 小数点符号出错。
microtime(true) 才适合计算执行时间,time() 在同一秒内恒为常量
测一段代码耗时,必须用 microtime(true) 起止两次再相减。例如:
$start = microtime(true); usleep(500); $end = microtime(true); echo $end - $start; // 输出类似 0.000502
time() 在整秒内不变化,哪怕你循环调用 1000 次,只要没跨秒,结果全一样。所以它根本不能用于毫秒/微秒级计时。另外注意:microtime(true) 返回的是系统单调时间(通常),不是严格 UTC —— 如果你要存“带微秒的绝对时间”,得额外用 DateTime::createFromFormat() 构造,代价更高。
高频调用下性能差距明显,别为“看起来更准”无脑换函数
实测在 Linux + PHP 8.2 下,100 万次调用平均耗时:time() ≈ 0.08s,microtime()(字符串版)≈ 0.23s,microtime(true) 快约 15% 但仍是前者的近 3 倍。原因在于:time() 只调一次 time(2) 系统调用;microtime() 需调 gettimeofday(2) 或 clock_gettime(),还要拼接或转浮点。如果你只是判断“是否过了一分钟”,用 time() 就够了;日志打点、APM 埋点、压测统计这类真需要区分同一秒内多次操作的场景,才值得上 microtime(true)。
高并发下 microsec 部分可能重复,time() 更稳但粒度太粗
microtime() 的微秒部分受系统时钟精度限制,Linux 下通常 1–15 微秒分辨率,Windows 更差。短时间高频调用(比如生成订单号、nonce)可能出现相同值。这不是 bug,是硬件+内核限制。解决办法包括:拼接进程 ID、随机数、序列号,或改用 random_bytes(8) + 时间戳组合。而 time() 虽然绝对不重复(一秒一变),但秒级粒度在并发场景下极易碰撞——比如 100 个请求在同一秒到达,全拿到同一个 time() 值,没法排序或去重。
真正难处理的是「既要高精度、又要唯一、还要快」的交叉需求。这时候得权衡:是接受微秒级重复风险,还是加锁/序列化/外部 ID 服务?别只盯着函数本身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











