專案中常需快取配置陣列、語言包等靜態資料。常見三種儲存格式:
return ['key' => 'val'];key = val,配合 parse_ini_file() 讀取。return serialize($arr);,讀取時 unserialize()。本文複現經典測試,驗證三者在大量引入場景下的效能差異。
<?php
// 測試資料:16 個鍵值對
$arr = [];
for ($i = 1; $i <= 16; $i++) {
$arr["db_host{$i}"] = '123';
}
// 1. arr.php - 直接回傳陣列
file_put_contents('arr.php', '\n";
foreach ($arr as $k => $v) {
$iniContent .= "$k = $v\n";
}
file_put_contents('ini.php', $iniContent);
// 3. str.php - 序列化回傳
file_put_contents('str.php', '
| 格式 | 耗時(秒) | 相對性能 |
|---|---|---|
| INI (parse_ini_file) | ~0.45 | 🏆 最快(約 1.0x) |
| 序列化 (unserialize) | ~0.55 | 第 2 名(約 1.2x) |
| return array | ~0.65 | 最慢(約 1.4x) |
結論:INI 格式讀取最快,其次是序列化,直接回傳陣列最慢。
parse_ini_file() 是 C 級內建函數,專門優化鍵值解析,無需經過 PHP 詞法分析器。unserialize() 同為 C 實現,但需重建陣列結構(zval 分配、哈希表插入)。require 仍需編譯執行(極快),但整體開銷略大於 INI 解析。require 仍需執行回傳指令、建立陣列結構。require 直接走記憶體 OpCode,return array 可能反而最快(零解析開銷)。require 變為內存陣列引用,效能極致。 開頭,防止直接訪問洩露配置。parse_ini_file() 預設不解析區段([section]),需傳 true 獲取多維陣列。serialize() 預設不包含類資訊,配合 allowed_classes 參數更安全。