PHP 的 var_dump() 預設直接輸出到頁面,但在記錄 Log 時需要把輸出內容轉成字串。透過 Output Buffering 機制可以輕鬆解決這個問題。
Output Buffering 原理
PHP 的 Output Buffering(輸出緩衝)允許你暫時攔截所有輸出,先存到記憶體緩衝區中,再決定要輸出還是取出為字串。
核心函數:
ob_start():開啟輸出緩衝,之後的輸出不會直接送到瀏覽器
ob_get_clean():取得緩衝區內容並清空緩衝(等同於 ob_get_contents() + ob_end_clean())
var_dump 輸出到字串
1
2
3
4
5
6
7
|
<?php
ob_start();
var_dump($party);
$result = ob_get_clean();
// 現在 $result 是字串,可以記錄到 log
Log::write('result => ' . $result, 'debug');
|
其他常用函數搭配 Output Buffering
print_r(適合讀取陣列/物件結構)
1
2
3
4
5
|
ob_start();
print_r($data);
$output = ob_get_clean();
error_log('Data: ' . $output);
|
print_r 也支援直接回傳字串的參數:
1
2
3
|
// 更簡單的寫法,不需要 ob_start
$output = print_r($data, true); // 第二個參數 true 表示回傳字串
error_log('Data: ' . $output);
|
var_export(輸出可執行的 PHP 語法)
1
2
3
|
// var_export 同樣支援 return 參數
$output = var_export($data, true);
error_log('Data: ' . $output);
|
var_export 的輸出是合法的 PHP 程式碼,適合用於序列化設定值。
三種函數比較
| 函數 |
顯示類型資訊 |
可回傳字串 |
輸出格式 |
var_dump |
✓(含型別和長度) |
需搭配 ob |
詳細,含型別標示 |
print_r |
部分 |
✓(第二參數) |
易讀,適合陣列 |
var_export |
✓ |
✓(第二參數) |
PHP 語法格式 |
實際應用場景
記錄 API 回傳資料到 Log
1
2
3
4
5
6
7
|
$response = json_decode($apiResult, true);
ob_start();
var_dump($response);
$dump = ob_get_clean();
Log::write('API Response: ' . $dump, 'api_debug');
|
將例外的詳細資訊記錄到 Log
1
2
3
4
5
6
|
try {
// 可能拋出例外的程式碼
} catch (Exception $e) {
$trace = $e->getTraceAsString();
Log::write('Exception: ' . $e->getMessage() . "\n" . $trace, 'error');
}
|
在 CLI 腳本中輸出除錯資訊
1
2
3
4
5
|
// CLI 環境可以直接輸出,不需要 ob_start
var_dump($data);
// 或寫入標準錯誤輸出
fwrite(STDERR, print_r($data, true));
|
注意事項
ob_start() 可以巢狀使用,但要確保每個 ob_start() 都有對應的 ob_end_clean() 或 ob_get_clean(),否則可能造成記憶體洩漏
- 在使用 Session 或 Header 相關函數前,要確保緩衝區已清空
- 生產環境建議使用專業的 Log 框架(如 Monolog),避免直接在頁面上顯示
var_dump