PHP实时输出卡在“加载中”的根本原因是服务端未发送完整响应头或输出缓冲未正确刷新;需关闭PHP输出缓冲、手动刷新并处理Web服务器缓冲层,同时注意反向代理与浏览器兼容性。
PHP实时输出时浏览器一直显示“加载中”
根本原因是服务端没有发送完整的HTTP响应头,或者输出缓冲未正确刷新,导致浏览器认为响应尚未结束。PHP默认启用输出缓冲(output_buffering),所有echo或print内容会先存入缓冲区,直到脚本结束或缓冲区满才真正发出——这会让前端卡在“加载中”状态,哪怕你每秒都在echo。
解决的关键是三件事:关闭默认缓冲、手动刷新输出、确保响应头已发送。常见错误包括只调用flush()却没关ob_end_flush(),或忽略Web服务器(如Nginx)的额外缓冲层。
- 在脚本开头立即调用
ob_end_clean()或ob_get_clean(),清除并关闭所有已启动的输出缓冲 - 调用
ini_set('output_buffering', 'off')和ini_set('zlib.output_compression', 'off'),禁用PHP级缓冲与压缩 - 发送最小必要响应头:
header('Content-Encoding: none')+header('Connection: close')(可选但推荐) - 每次输出后必须连续调用
echo str_repeat(' ', 256)(填充空白防某些浏览器不触发渲染)+flush()+ob_flush()
为什么flush()单独调用无效
flush()只刷新PHP的“系统输出缓冲”,不处理PHP自身的输出缓冲(ob_*系列)或Web服务器缓冲。如果ob_start()被隐式触发(比如某些框架或php.ini里output_buffering=4096),flush()完全不起作用。
典型失效场景:本地Apache可能表现正常,但上线到Nginx + PHP-FPM环境就卡住——因为Nginx默认开启fastcgi_buffering on,会攒够8KB才转发给浏览器。
立即学习“PHP免费学习笔记(深入)”;