PHP页面仍在运行时如何用flush()或ob_flush()立即输出响应头
解决建议
- 首先删除代码中主动开启的输出缓冲逻辑:你在代码开头调用了
ob_start()主动开启了用户态输出缓冲,若php.ini中output_buffering已经设为Off,不需要额外开启缓冲,同时你之前的.htaccess规则仅作用于html/htm/js/css后缀的静态文件,PHP动态脚本不受该规则约束,相关缓冲配置不生效。 - 关闭Apache层压缩与缓冲:XAMPP默认开启mod_deflate/gzip压缩模块,该模块会缓存全部响应内容完成后才统一发送,在.htaccess中添加
SetEnv no-gzip 1关闭当前请求的压缩规则;同时检查httpd.conf中的OutputBuffer配置,将值改为0,关闭Apache层的输出缓冲。 - 补充必要响应头:主动添加
header("Content-Length: 0");明确告知客户端响应体长度为0,服务端不会再发送额外内容,Windows环境下的Apache必须收到明确的内容长度头才会提前返回响应,不会等待后续代码执行完成。 - 新增会话关闭与连接终止逻辑:如果你的代码开启了会话,需要先调用
session_write_close()释放会话锁,避免后续其他请求阻塞;如果使用PHP-FPM模式,调用fastcgi_finish_request()主动断开与客户端的连接,后续代码执行完全不会影响客户端响应。
修正后的代码示例
<?php // 若开启了会话先关闭,释放会话锁 if (session_status() === PHP_SESSION_ACTIVE) { session_write_close(); } header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1. header("Pragma: no-cache"); // HTTP 1.0. header("Expires: 0"); // Proxies. header('HTTP/1.1 201 Created'); header('Location: http://'.$ipaddress.':'.$port.'/path/file'); // 明确告知客户端无响应体 header("Content-Length: 0"); // 清空所有层级的输出缓冲 while (ob_get_level()) { ob_end_clean(); } flush(); // PHP-FPM环境下加这行,立刻断开客户端连接 if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } // 后续长时间执行的代码 ... ?>
内容的提问来源于stack exchange,提问作者Tekno Geekz
相关产品推荐
相关产品推荐

