PHP sleep()期间输出不显示是因输出缓冲未刷新,需关闭output_buffering、调用ob_flush()和flush()、禁用Nginx缓冲并凑够1KB响应体。
PHP sleep() 期间输出缓冲没反应?先关掉 output_buffering
默认开启的 PHP 输出缓冲会把 echo、print 的内容先存起来,等脚本结束或缓冲满才发给浏览器——所以加了 sleep() 后你啥都看不到,不是代码错,是缓冲在“憋着”。解决办法很直接:关掉它。
操作方式有三种,按优先级推荐:
- 在脚本开头加
ob_end_flush()+ini_set('output_buffering', 'Off')(注意:后者在某些 SAPI 如 CLI 下无效) - 改
php.ini:把output_buffering = 4096改成output_buffering = Off,然后重启 Web 服务 - 用
apache2ctl graceful或nginx -s reload刷新配置后,再确认phpinfo()里output_buffering确实是Off
flush() 和 ob_flush() 到底谁先调?顺序不能反
即使关了全局缓冲,Web 服务器(如 Nginx、Apache)和浏览器自己也有缓存层。想让 sleep() 中间输出的内容实时可见,必须手动触发刷新链:
- 先调
ob_flush():清空 PHP 用户层输出缓冲(如果还开着的话) - 再调
flush():把 PHP 底层的写入操作推给 Web 服务器 - 两者缺一不可,顺序颠倒或只调一个,大概率还是卡住
典型写法:
立即学习“PHP免费学习笔记(深入)”;