<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 这部分代码与正文内容无关,仅作示例演示</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"开始执行脚本...<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"准备输出内容...<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
* 标题:怎么用 flush() 实现内容实时输出?PHP 实战技巧解析
*
* 在 PHP 中,默认情况下,网页内容是等到脚本执行完毕才一次性发送到客户端浏览器的。
* 这意味着如果你的程序需要执行较长时间,用户在等待时看不到任何反馈,体验较差。
* 为了解决这个问题,PHP 提供了 flush() 函数,可以将缓冲区的内容即时发送给浏览器,实现内容的“实时输出”。
*
* 本文将详细介绍 flush() 的使用方法,并结合实战技巧帮助你在项目中提升用户体验。
*/</span>
</span><span><span class="hljs-comment">// 1. flush() 的基本原理</span></span><span>
</span><span><span class="hljs-comment">// flush() 函数用于强制将 PHP 输出缓冲区的内容发送给客户端。</span></span><span>
</span><span><span class="hljs-comment">// 但是,需要注意的是,flush() 并不会清空 PHP 的输出缓冲区,它只是试图将当前缓冲区内容推送到客户端。</span></span><span>
</span><span><span class="hljs-comment">// 2. 结合 ob_flush()</span></span><span>
</span><span><span class="hljs-comment">// 在实际应用中,由于 PHP 默认开启了输出缓冲(Output Buffering),单独调用 flush() 可能不起作用。</span></span><span>
</span><span><span class="hljs-comment">// 因此,一般配合 ob_flush() 使用,先清空 PHP 的缓冲区,再使用 flush() 推送到浏览器。</span></span><span>
</span><span><span class="hljs-comment">//</span></span><span>
</span><span><span class="hljs-comment">// 示例:</span></span><span>
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> <= </span><span><span class="hljs-number">5</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"当前进度:第 <span class="hljs-subst">$i</span></span></span><span> 步完成...<br>";
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// 模拟耗时操作</span></span><span>
}
</span><span><span class="hljs-comment">// 3. 关闭浏览器和服务器缓存的影响</span></span><span>
</span><span><span class="hljs-comment">// 浏览器和服务器的缓存机制可能阻碍内容的实时显示。</span></span><span>
</span><span><span class="hljs-comment">// 建议设置 HTTP 头部禁用缓存:</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Cache-Control: no-cache"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Pragma: no-cache"</span></span><span>);
</span><span><span class="hljs-comment">// 4. 关闭 gzip 压缩</span></span><span>
</span><span><span class="hljs-comment">// 如果服务器开启了 gzip 压缩,flush() 可能失效,因为压缩后内容必须完整才能解压。</span></span><span>
</span><span><span class="hljs-comment">// 可以尝试在 PHP 配置或服务器配置中关闭 gzip,或者针对实时输出页面禁用。</span></span><span>
</span><span><span class="hljs-comment">// 5. 使用隐式刷新</span></span><span>
</span><span><span class="hljs-comment">// 通过 ini_set('implicit_flush', 1) 可开启隐式刷新,PHP 在每次输出后自动调用 flush()。</span></span><span>
</span><span><span class="hljs-comment">// 也可使用 ob_implicit_flush(true) 达到同样效果。</span></span><span>
</span><span><span class="hljs-comment">// 6. 注意输出格式和内容</span></span><span>
</span><span><span class="hljs-comment">// 浏览器需要足够的内容才能触发渲染,建议输出的内容足够多或加上一些空格填充。</span></span><span>
</span><span><span class="hljs-comment">// 7. 实战示例总结</span></span><span>
</span><span><span class="hljs-comment">// 结合上述方法,完整示例如下:</span></span><span>
<span class="hljs-comment">/*
<?php
header("Content-Type: text/html; charset=utf-8");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
ob_implicit_flush(true);
while (</span></span><span><span class="hljs-doctag">@ob</span></span><span>_end_flush()); // 关闭所有输出缓冲
for ($i = 1; $i <= 10; $i++) {
echo "进度:$i / 10<br>";
echo str_repeat(' ', 1024); // 填充输出,帮助浏览器立即渲染
flush();
sleep(1);
}
?>
*/
</span><span><span class="hljs-comment">// 通过以上方式,可以显著改善长时间脚本运行时用户的等待体验,实时看到内容更新。</span></span><span>
</span><span><span class="hljs-comment">// 结语</span></span><span>
</span><span><span class="hljs-comment">// flush() 在 PHP 实战中是一个非常实用的技巧,尤其适合进度显示、日志实时输出等场景。</span></span><span>
</span><span><span class="hljs-comment">// 理解其工作原理,合理配置服务器和 PHP 设置,才能发挥最大效果。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>