PHP 輸出緩衝允許腳本將輸出暫存於記憶體,而非直接發送至瀏覽器。這帶來三大優勢:內容後處理(壓縮、替換、捕獲)、流量控制(分塊發送、長連線)、標頭延遲發送(在輸出內容前仍可修改 Header/Cookie/Session)。本文系統整理核心函數、常見模式與實戰範例。
| 函數 | 用途 | 回傳值 |
|---|---|---|
ob_start(callable $callback=null, int $chunk_size=0, int $flags=PHP_OUTPUT_HANDLER_STDFLAGS) | 開啟緩衝,可指定回調處理輸出 | bool |
ob_get_contents() | 取得緩衝區內容(不清空) | string|false |
ob_get_clean() | 取得內容並關閉緩衝 | string |
ob_end_flush() | 發送緩衝內容並關閉緩衝 | bool |
ob_end_clean() | 丟棄緩衝內容並關閉緩衝 | bool |
ob_flush() | 發送緩衝內容(不關閉) | bool |
flush() | 將 PHP/WEB 伺服器緩衝推送至瀏覽器 | void |
ob_get_level() | 取得巢狀緩衝層級 | int |
ob_list_handlers() | 列出當前啟用的處理器 | array |
output_add_rewrite_var() | URL 重寫自動加入參數(表單 action、連結 href) | bool |
output_reset_rewrite_vars() | 重置 URL 重寫變數 | bool |
<?php // 必須在任何輸出前呼叫 ob_start('ob_gzhandler'); // 自動檢測瀏覽器 Accept-Encoding,支援 gzip/deflate echo "Hello World
"; // 大量 HTML... // 腳本結束自動 ob_end_flush() // 或手動控制 // ob_end_flush(); ?>
注意:ob_gzhandler 會自動發送 Content-Encoding: gzip 標頭,若已手動 header('Content-Encoding: ...') 會衝突。生產環境建議在 Nginx/Apache 層開啟 gzip,PHP 層關閉以減少 CPU 消耗。
<?php ob_start(function ($buffer) { // 1. 移除開發環境註解 $buffer = preg_replace('/.*?/s', '', $buffer); // 2. 替換版本號 $buffer = str_replace('{VERSION}', '1.2.3', $buffer); // 3. CSS/JS 版本戳(快取破壞) $buffer = preg_replace('/(]+href="[^"]+\.css)(")/i', '$1?v=123$2', $buffer); $buffer = preg_replace('/(