You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:36:05