sleep单位为秒,usleep为微秒;写错单位会导致休眠时间偏差百万倍;二者在web sapi中均阻塞fpm worker,但sleep释放进程执行权,usleep仅挂起线程且可能被信号中断返回剩余时间。

sleep 参数单位是秒,usleep 是微秒——写错单位会导致休眠时间差百万倍,不是“不准”,而是根本没按预期停。
sleep(1) 和 usleep(1000000) 看似等价,但行为不完全相同
两者都≈暂停 1 秒,但底层调度逻辑不同:sleep 会释放 PHP 进程的执行权,让操作系统调度其他任务;usleep 在多数 SAPI(如 FPM)中只是挂起当前线程,不释放 worker 进程资源。这意味着:
- 在 CLI 模式下,差异感知较弱
- 在 Web 请求中,
usleep(1000000)仍占用一个 FPM worker,和sleep(1)一样阻塞并发 -
usleep可能被信号(如SIGALRM)中断并返回剩余微秒数;sleep不返回剩余时间,只返回 0 或 false -
usleep(0)合法但无效;sleep(0)直接返回,不休眠
传参类型和非法值在 PHP 7+ 会直接报错
PHP 7 起对参数校验更严格,老代码容易崩:
-
sleep(-1)或sleep("2")在 PHP 5 可能只发警告,PHP 7+ 抛ValueError -
usleep(null)、usleep([])同样触发致命错误,而非静默转成 0 - 浮点数会被截断:
sleep(1.9)→ 实际休眠 1 秒;usleep(1500.5)→ 截成usleep(1500) - 超范围值会被拒绝:
usleep(2000000)合法;usleep(-100)报错
想等 100ms?别用 sleep(0.1),也别硬写 usleep(100000)
常见误操作是把毫秒当秒或漏掉三个零:
-
sleep(0.1)→ 强制转整为sleep(0),等于没停 -
usleep(100)→ 仅 100 微秒 ≈ 0.1 毫秒,几乎不可感知 - 真正等 100ms 应写
usleep(100000)(100 × 1000) - 但注意:Linux 下
usleep最小有效粒度通常 ≥1000 微秒(1ms),低于它可能被系统调度吞掉
实际延时永远受系统调度影响,别在关键路径上依赖它做精确计时;Web 场景下更不该用它们模拟慢接口——worker 卡住,QPS 就断崖下跌。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











