<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">"當前進度:1。 <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>