PHP 輸出緩衝分為兩層:PHP 內部緩衝 與 Web Server 緩衝。ob_flush() 將 PHP 緩衝推送到 Server 緩衝,flush() 再將 Server 緩衝推送到瀏覽器。正確順序必須是先 ob_flush() 再 flush()。
PHP 腳本 → PHP Output Buffer → ob_flush() → Server Buffer → flush() → 瀏覽器
<?php
echo str_repeat('m0sh1', 1000); // 先輸出大量資料填滿緩衝
for ($i = 0; $i < 4; $i++) {
echo $i . '<br />';
ob_flush(); // 1. 釋放 PHP 緩衝
flush(); // 2. 釋放 Server 緩衝
sleep(1); // 模擬耗時運算
}
?>
瀏覽器會每秒顯示一行數字(0,1,2,3),而非等 4 秒一次性顯示。
| 問題 | 原因 | 解決 |
|---|---|---|
| 無效果 | Web Server(Nginx/Apache gzip)再次緩衝 | 關閉 gzip 或加 header('X-Accel-Buffering: no') |
| 瀏覽器不顯示 | 瀏覽器需收到足夠資料才渲染 | 先輸出 1-2KB 填充資料(如 str_repeat) |
| 順序顛倒 | 先 flush() 再 ob_flush() | 嚴守 ob_flush() → flush() 順序 |
掌握雙重緩衝機制,才能真正實現 PHP 即時輸出。