echo/print → PHP output_buffer → TCP buffer → Browserphp.ini 設定,預設 4096 (4KB)。超過即自動刷新至 TCP。ob_end_flush() 才輸出。<?php
for ($i=0; $i<10; $i++) {
echo $i . '<br>';
sleep(2);
}
?>
結果:腳本跑完 20 秒後一次性輸出所有內容(未滿 4KB)。
<?php
for ($i=0; $i<10; $i++) {
echo $i . str_repeat(' ', 500) . '<br>'; // 填充觸發瀏覽器渲染
flush();
sleep(1);
}
?>
結果:每秒間歇性輸出,瀏覽器漸進式顯示。
<?php
for ($i=0; $i<10; $i++) {
echo file_get_contents('f.txt') . $i . '<br>'; // f.txt > 4KB
sleep(1);
}
?>
結果:每次迴圈輸出超過 4KB,觸發自動刷新,間歇性輸出。
<?php
ob_start();
for ($i=0; $i<10; $i++) {
echo file_get_contents('f.txt') . $i . '<br>';
sleep(1);
}
?>
結果:ob_start() 擴大緩衝區,腳本結束才一次性輸出。
| 需求 | 配置建議 |
|---|---|
| 漸進式輸出長耗時任務進度 | output_buffering=0 + flush() + 填充字元 |
| 完整頁面一次性輸出(預設行為) | 保持預設 output_buffering=4096,不呼叫 ob_start() |
| 需在腳本中途捕獲輸出內容 | ob_start() → 處理 → ob_get_clean() |
| 壓縮輸出 (gzip) | ob_start('ob_gzhandler') 或 Web Server 層開啟 gzip |
memory_limit。理解 PHP 多層緩衝機制(PHP 內部 → TCP → 瀏覽器)是掌控輸出行為的關鍵。根據業務選擇「漸進式」或「一次性」輸出策略,並配合 Web Server 設定,才能穩定實現預期效果。