許多開發者混淆 ob_flush 與 flush,甚至以為它們功能相同。實際上它們操作不同層級的緩衝區,正確搭配才能實現真正的即時輸出 (如長時間任務進度顯示)。
| 函數 | 操作對象 | 生效條件 |
|---|---|---|
ob_flush() | PHP 內部輸出緩衝區 | 啟用 ob_start() 或 output_buffering 時 |
flush() | Web Server (Apache/Nginx) 輸出緩衝區 | PHP 以 Apache Module (handler/filter) 運行時 |
ob_flush() 將 PHP 緩衝區內容推送到 Web Server 緩衝區flush() 強制 Web Server 將資料發送給瀏覽器ob_start(); // 啟用 PHP 輸出緩衝
// ... 產生輸出 ...
ob_flush(); // 1. 先刷新 PHP 緩衝區
flush(); // 2. 再刷新 Web Server 緩衝區
為什麼要這個順序?
若先flush(),Web Server 緩衝區可能尚無資料 (PHP 緩衝區未釋放);先ob_flush()確保資料已到達 Web Server 層,再flush()推送給客戶端。
flush() 可能無效,因無直接控制 Web Server 緩衝區權限。flush() 不即時生效。</table> 才顯示表格。解決:輸出足夠空白字元或 <br>。ob_flush(),但為可移植性建議雙函數配套使用。<?php
ob_start();
for ($i = 1; $i <= 10; $i++) {
echo "處理第 $i 步...<br>\n";
ob_flush();
flush();
sleep(1); // 模擬耗時操作
}
echo "完成!";
?>
ob_start():開啟輸出緩衝ob_get_contents():取得緩衝區內容ob_clean():清空緩衝區ob_end_flush():輸出並關閉緩衝ob_end_clean():清空並關閉緩衝參考來源:Laruence 博客深度解析