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

为什么ob_flush在Apache本地环境可用但远程访问无效?

可行解决步骤

  • 先确认Web服务的输出缓冲配置:
    • 若使用IIS,打开IIS管理器→对应站点→FastCGI设置,选中绑定的PHP处理程序,点击「编辑」,将responseBufferLimit值改为0,该参数默认开启且会缓存小于阈值的响应,本地访问因链路短不会触发,远程访问会被攒包;同时进入站点的「输出缓存」功能,删除所有针对.php后缀的缓存规则,禁用全局输出缓存。
    • 若使用Apache,关闭mod_deflate、mod_cache模块针对PHP脚本的缓存配置;若使用Nginx,在站点配置中添加fastcgi_buffering off; gzip off; 规则。
  • 确认PHP核心配置:打开php.ini,将output_buffering设为Off、zlib.output_compression设为Off,修改后重启Web服务生效。
  • 调整业务代码:
    • 代码执行前先清空所有已开启的输出缓冲,输出禁用缓存的响应头,避免浏览器自身缓存响应
    • 每次输出时添加4096字节的填充字符,跳过TCP层Nagle算法的攒包逻辑
    • 合并两种flush写法确保输出强制刷新
      调整后的参考代码如下:
public function getProgressTest()
{
    // 清空所有层级的输出缓冲
    while (ob_get_level()) {
        ob_end_flush();
    }
    ob_implicit_flush(true);
    
    // 输出防缓存头
    header('Cache-Control: no-cache, no-store, must-revalidate');
    header('Content-Type: text/plain; charset=utf-8');

    for ($i = 1; $i <= 5; $i++) {
        sleep(1);
        // 加填充字符跳过TCP攒包阈值
        echo str_pad($i . ", ", 4096, " ");
        ob_flush();
        flush();
    }
}

内容的提问来源于stack exchange,提问作者brian1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:21:01