PHP 的輸出緩衝(Output Buffering)機制允許腳本將輸出內容暫存於內存緩衝區,而非直接發送給瀏覽器。核心函數 ob_start()、ob_get_contents()、ob_end_flush()、ob_clean() 為靜態頁生成、延遲輸出、Header 後輸出等場景提供強大支持。
| 函數 | 作用 | 典型用法 |
|---|---|---|
ob_start(callable $callback = null) | 開啟緩衝,可選回調處理輸出 | ob_start('ob_gzhandler') 啟用 Gzip 壓縮 |
ob_get_contents() | 獲取緩衝區內容(字符串) | $content = ob_get_contents(); |
ob_get_clean() | 獲取內容並清空/關閉緩衝區 | $content = ob_get_clean(); |
ob_end_flush() | 發送緩衝內容並關閉緩衝區 | 正常頁面結束輸出 |
ob_end_clean() | 丟棄緩衝內容並關閉緩衝區 | 錯誤處理、重定向前清理 |
ob_flush() | 發送緩衝內容(不關閉) | 長連接、流式輸出分批發送 |
ob_clean() | 清空緩衝區(不關閉) | 重新生成內容前清理 |
查看";
'ok', 'msg' => '完成']); ob_end_flush();
true];
} catch (Exception $e) {
ob_clean(); // 清空可能已輸出的錯誤信息
http_response_code(500);
$data = ['success' => false, 'error' => $e->getMessage()];
}
header('Content-Type: application/json');
echo json_encode($data);
ob_end_flush();
常見陷阱與最佳實踐
ob_start() 可多次調用,形成棧結構,必須配對 ob_end_flush()/clean()。使用 ob_get_level() 檢查層級。header() 失效。習慣在入口文件最頂部 ob_start()。memory_limit。分塊輸出用 ob_flush() + flush()。ob_gzhandler 交給 Web 服務器(Nginx gzip)。try_files 直接服務靜態文件,PHP 不再介入。熟練掌握輸出緩衡控制,是 PHP 開發者從「能跑通」進階到「架構優雅」的關鍵技能之一。