在 PHP 中使用 header() 或 setcookie() 前若有任何輸出 (含空白、換行),會觸發 "Header had already sent" 錯誤。PHP 4 引入輸出緩衡函數集,將非 Header 輸出暫存於伺服器記憶體,延遲發送至瀏覽器,完美解決此問題。
| 函數 | 原型 | 功能 | 說明 |
|---|---|---|---|
| flush | flush() | 輸出並清空緩衝區 | 常用、效率高 |
| ob_start | void ob_start(void) | 開啟輸出緩衝 | 啟用後所有非 Header 輸出暫存內部緩衝區 |
| ob_get_contents | string ob_get_contents(void) | 取得緩衝區內容 | 未啟用緩衝時回傳 FALSE |
| ob_get_length | int ob_get_length(void) | 取得緩衝區長度 | 未啟用時回傳 FALSE |
| ob_end_flush | void ob_end_flush(void) | 發送緩衝內容並關閉緩衝 | 輸出內容給瀏覽器 |
| ob_end_clean | void ob_end_clean(void) | 刪除緩衝內容並關閉緩衝 | 不輸出內容 |
| ob_implicit_flush | void ob_implicit_flush([int flag]) | 開啟/關閉絕對刷新 | 類似 Perl $|=x,預設關閉 |
<?php
ob_start(); // 開啟緩衝
echo "Welcome\n"; // 輸出暫存緩衝區
header("Location: next.php"); // 重導向不再報錯
?>
若移除 ob_start(),第 4 行會報錯;加上後,echo 內容留在伺服器緩衝區,直到 flush 或 ob_end_flush 才輸出,Header 尚未發送,故不報錯。
<?php
ob_start();
phpinfo();
$info = ob_get_contents(); // 取得緩衝區內容
$file = fopen('phpinfo.txt', 'w');
fwrite($file, $info);
fclose($file);
?>
此法可將不同用戶的 phpinfo() 輸出儲存為檔案,舊版 PHP 無法辦到。緩衝區控制實質上將「過程」轉化為「函數」,極大擴展應用彈性。