优先选sleep()用于秒级等待,usleep()用于亚秒级但需兼容性兜底;Web中慎用长延时以免阻塞worker,高精度场景应改用time_nanosleep()或协程。

选 sleep() 还是 usleep(),关键看你要等多久、在哪运行、精度要求高不高。
秒级等待,直接用 sleep()
需要停 1 秒、3 秒、30 秒这类整数秒间隔时,sleep() 更合适:
- 参数简单:传整数秒,比如
sleep(2)就是停 2 秒 - Web 环境下更稳定:在 PHP-FPM 或 Apache 中,它释放执行权,调度更友好
- 兼容性好:所有 PHP 版本、所有系统(包括 Windows)都支持
- 别写
sleep(0.5)——会被截成sleep(0),等于没停
亚秒级控制,优先考虑 usleep(),但得加兜底
要等几十毫秒、几百毫秒(比如重试退避、轮询间隔),才需要用到 usleep():
- 单位是微秒,100ms =
usleep(100000),不是usleep(100) - Linux 下最小有效值一般 ≥1000 微秒(即 ≥1ms),低于它可能无效果
- 必须检查函数是否存在:
if (function_exists('usleep')) { usleep(50000); } else { sleep(1); } - Windows 下旧版 PHP 不支持 usleep(),PHP 8+ 已基本可用,但仍建议验证
Web 请求里,慎用长延时
不管是 sleep 还是 usleep,只要在 Web SAPI(如 FPM)中执行,就会卡住一个 worker 进程:
立即学习“PHP免费学习笔记(深入)”;
-
sleep(5)或usleep(5000000)都会让用户等 5 秒,且期间无法处理其他请求 - 高并发下容易耗尽 worker,导致请求堆积、超时、503 错误
- 真要“延迟响应”,改用客户端跳转:
header("Refresh: 3; url=done.php");,服务端不阻塞 - 长期定时任务别放 Web 请求里,应交给 crontab 或队列系统
精度和可靠性不能依赖它们
两者都不是高精度计时工具:
- 实际延时受系统调度影响,可能比设定值略长
- usleep 可能被信号中断(尤其 PHP 7.4+),sleep 被中断会返回剩余秒数
- 关键路径上做精确等待(如实时通信、硬件同步),应改用
time_nanosleep()或异步协程(如 Swoole 的co::sleep()) - 调试时注意
max_execution_time和disable_functions是否禁用了这些函数



















