当前位置: 首页> 最新文章列表> 用 flush() 不生效?可能是你的 Web 服务器设置有问题

用 flush() 不生效?可能是你的 Web 服务器设置有问题

gitbox 2025-09-20
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这里是一些与文章内容无关的 PHP 代码</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"初始化环境...\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 文章正文开始</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>

<h1>用 </span><span><span class="hljs-title function_ invoke__">flush</span></span><span>() 不生效?可能是你的 Web 服务器设置有问题</h1>

<p>在 PHP 开发中,`</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()` 函数常被用来立即将输出发送到客户端,而不是等到脚本执行完再统一输出。它在实现长时间运行的任务、实时日志显示、或者进度条更新时非常有用。然而,很多开发者会遇到一个问题:明明调用了 <code></span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()

2. Web 服务器的缓冲

即使 PHP 输出已经被刷新,Web 服务器(如 Apache、Nginx)也可能继续缓存输出,直到缓冲区满或脚本结束。常见情况:

  • Apache:mod_deflate 或 mod_gzip 压缩模块会延迟输出。可以尝试关闭这些模块的压缩功能或调整配置。
  • Nginx:默认会启用 gzip 压缩,同时存在 proxy_buffering,也可能阻止立即输出。可以在 location 块中设置 proxy_buffering off;

3. 浏览器行为

一些浏览器会等待一定量的数据后才开始渲染页面,尤其是当输出量很小的时候。常见做法:

  • 在输出内容前发送足够的空白字符,让浏览器触发渲染。
  • 在输出前发送 HTTP 头:header('Content-Encoding: none'); 防止压缩导致延迟。

4. 综合示例

</span><span><span><?php</span></span><span>
</span><span><span>// 禁用 PHP 输出缓冲</span></span><span>
</span><span><span>while</span></span><span> (</span><span><span class="function_ invoke__">ob_get_level</span></span><span>() > </span><span><span>0</span></span><span>) {
    </span><span><span class="function_ invoke__">ob_end_flush</span></span><span>();
}

</span><span><span>echo</span></span><span> </span><span><span class="function_ invoke__">str_repeat</span></span><span>(</span><span><span>" "</span></span><span>, </span><span><span>1024</span></span><span>); </span><span><span>// 发送足够数据触发浏览器渲染</span></span><span>

</span><span><span>for</span></span><span> (</span><span><span>$i</span></span><span> = </span><span><span>1</span></span><span>; </span><span><span>$i</span></span><span> <= </span><span><span>5</span></span><span>; </span><span><span>$i</span></span><span>++) {
    </span><span><span>echo</span></span><span> </span><span><span>"处理第 <span>$i</span></span></span><span> 步...<br>\n";
    </span><span><span class="function_ invoke__">flush</span></span><span>();
    </span><span><span class="function_ invoke__">sleep</span></span><span>(</span><span><span>1</span></span><span>);
}
</span><span><span>?></span></span><span>

通过上述方法,你可以确保 flush() 能够在大多数情况下正常生效。不过,请记住,输出延迟可能是 PHP、Web 服务器和浏览器多个环节共同影响的结果,需要逐层排查。

<?php // 文章结束,尾部与内容无关的部分 echo "文章加载完毕。\n"; ?>