CLI 腳本中預設輸出直接送至終端。若需攔截輸出內容供後續處理(如寫日誌、發郵件、返回 API),需正確使用輸出緩衝函數組合。
| 函數 | 行為 |
|---|---|
| ob_start() | 開啟輸出緩衝,後續輸出存入緩衝區 |
| ob_get_contents() | 獲取緩衝區內容(不清除) |
| ob_get_clean() | 獲取內容並刪除緩衝區、關閉緩衝(最常用) |
| ob_end_flush() | 輸出緩衝區內容並關閉緩衝(會顯示在終端) |
| ob_end_clean() | 刪除緩衝區內容並關閉緩衝(不輸出) |
<?php
ob_start(); // 開啟緩衝
echo "這行不會顯示在終端\n";
print_r($someArray);
var_dump($object);
// 獲取並清除緩衝,關閉緩衝
$output = ob_get_clean();
// $output 現在包含所有輸出內容
file_put_contents('log.txt', $output);
// 或 return $output; 供調用者使用
?>
<?php ob_start(); echo "測試"; ob_end_flush(); // 這會將內容輸出到終端!不符合「靜默」需求 ?>
<?php ob_start(); // 第 1 層 echo "外層 "; ob_start(); // 第 2 層 echo "內層 "; $inner = ob_get_clean(); // 獲取內層,關閉第 2 層 echo "外層結尾 "; $outer = ob_get_clean(); // 獲取外層(含內層內容),關閉第 1 層 // $outer = "外層 內層 外層結尾 " ?>
ob_get_clean() 可完全攔截。proc_open() 執行,也可用管道讀取 STDOUT/STDERR,但 ob_* 更簡單。php://output 流不受 ob_* 控制,直接寫入底層輸出。