PHP 的輸出緩存(Output Buffering)機制允許腳本將輸出暫存在內存緩存區,而非直接發送給瀏覽器。掌握 ob_start()、ob_get_contents()、ob_get_flush() 等函數的區別,對優化頁面加載、實現模板引擎、捕獲輸出至關重要。
| 函數 | 作用 | 返回值 | 是否關閉緩存區 |
|---|---|---|---|
ob_start() | 開啟輸出緩存 | bool | 否 |
ob_get_contents() | 獲取緩存區內容(不刷新) | string | 否 |
ob_get_clean() | 獲取內容並刪除緩存區內容 | string | 是(關閉並清空) |
ob_get_flush() | 獲取內容並發送給瀏覽器(刷新) | string | 是(關閉並發送) |
ob_end_flush() | 發送緩存區內容並關閉緩存 | bool | 是 |
ob_end_clean() | 刪除緩存區內容並關閉緩存 | bool | 是 |
$buf = ob_get_flush(); // 相當於 ob_end_flush(),但多返回緩存區字符串
// 此時緩存區已關閉並發送給瀏覽器,再調用 ob_get_contents() 將返回空字符串
ob_get_flush() = ob_get_contents() + ob_end_flush() 的原子操作,避免了中間狀態不一致。
<?php
for ($i = 0; $i < 10; $i++) {
ob_start();
echo "This is iteration $i: ";
// 錯誤示範:獲取後清空,導致內容丟失
// $buf = ob_get_contents();
// ob_clean();
// 正確:一次性獲取並發送,關閉緩存
$buf = ob_get_flush();
// 緩存區已關閉,ob_get_contents() 返回空
$test = ob_get_contents();
echo $test . "---->"; // 輸出空字符串
echo $buf; // 輸出真實內容
echo memory_get_usage() . " ";
echo "<br />";
}
?>
include 視圖文件輸出,賦值給變量再佈局。ob_start() → 業務邏輯 → file_put_contents(ob_get_clean()) 生成靜態 HTML。ob_start('ob_gzhandler') 自動 Gzip 壓縮輸出。ob_flush() + flush() 逐步發送,避免內存峰值。ob_start() 時,每層需對應 ob_end_flush()/clean(),否則外層捕獲不到內容。ob_get_flush() 後緩存區已關閉,不可再調用任何 ob_* 函數**(除非重新 ob_start())。