首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 將陣列/物件完美寫入檔案:var_export 與 print_r 進階用法

     編輯:PHP 相關知識

前言:除錯時為何需要將變數存檔?

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 整合

生產環境建議使用 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]);

併發寫入衝突解決方案

  • FILE_APPEND | LOCK_EX:單機低併發足夠(如上例)。
  • 日誌輪轉:logrotate 或 Monolog RotatingFileHandler 避免單檔過大。
  • 高併發:改用 Syslog (UDP)、Redis List、Kafka、ELK Stack 等集中式日誌系統。

安全提醒

  • 敏感資料脫敏:寫入前過濾密碼、Token、信用卡號等(array_walk_recursive 遞迴處理)。
  • 權限控制:日誌目錄僅限應用使用者與運維讀取(chmod 750)。
  • 不記錄完整卡號/身分證:僅保留前 6 後 4 碼。

結語

var_export(..., true) 是 PHP 開發者將複雜變數「完美落盤」的瑞士刀。搭配 file_put_contents(..., FILE_APPEND | LOCK_EX) 即可構建可靠的單機除錯日誌;隨專案成長,平滑遷移至 Monolog + 集中式日誌系統,即可擁有企業級可觀測能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved