API 對接、支付回調、異步任務等場景,無法直接在瀏覽器查看變數。將完整結構寫入日誌檔,配合 tail -f 即可即時追蹤,是後端開發必備技能。
| 函數 | 回傳值 | 輸出格式 | 適用場景 |
|---|---|---|---|
var_export($var, true) | 合法 PHP 代碼字串 | array ( 0 => 'a', 'key' => 'value', ) | 需還原為代碼、結構複雜、含物件 |
print_r($var, true) | 易讀字串 | Array ( [0] => a [key] => value ) | 快速人工閱讀、純陣列 |
json_encode($var, JSON_UNESCAPED_UNICODE) | JSON 字串 | {"0":"a","key":"value"} | 跨語言、日誌分析系統、API 回應 |
serialize($var) | 序列化字串 | a:2:{i:0;s:1:"a";s:3:"key";s:5:"value";} | PHP 內部儲存、Session、快取 |
/**
* 將任意變數以指定格式追加寫入檔案
* @param mixed $data 要記錄的變數
* @param string $file 日誌檔路徑
* @param string $format 'export'|'print'|'json'|'serialize'
* @param string $prefix 每行前綴(如時間戳)
*/
function writeVarToFile($data, $file, $format = 'export', $prefix = '') {
$str = match ($format) {
'export' => var_export($data, true),
'print' => print_r($data, true),
'json' => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
'serialize'=> serialize($data),
default => var_export($data, true),
};
$line = ($prefix ? $prefix . ' ' : '') . $str . PHP_EOL . str_repeat('-', 80) . PHP_EOL;
// 使用 LOCK_EX 確保併發寫入不衝突
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
// 使用範例
$user = ['id' => 101, 'name' => '張三', 'tags' => ['vip', 'beta']];
writeVarToFile($user, __DIR__ . '/logs/debug.log', 'export', date('Y-m-d H:i:s'));
writeVarToFile($user, __DIR__ . '/logs/debug_json.log', 'json', date('c'));
生產環境建議使用 Monolog,支援多處理器、格式化器、處理器(檔案、Slack、Elasticsearch等)。
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
$log = new Logger('api');
$handler = new StreamHandler(__DIR__ . '/logs/api.log', Logger::DEBUG);
$handler->setFormatter(new LineFormatter(
"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n",
"Y-m-d H:i:s"
));
$log->pushHandler($handler);
// 記錄陣列/物件自動轉 JSON
$log->info('Payment callback received', ['order_id' => '20240101001', 'amount' => 99.9, 'payload' => $_POST]);
logrotate 或 Monolog RotatingFileHandler 避免單檔過大。array_walk_recursive 遞迴處理)。chmod 750)。var_export(..., true) 是 PHP 開發者將複雜變數「完美落盤」的瑞士刀。搭配 file_put_contents(..., FILE_APPEND | LOCK_EX) 即可構建可靠的單機除錯日誌;隨專案成長,平滑遷移至 Monolog + 集中式日誌系統,即可擁有企業級可觀測能力。