require 'array.php' (PHP 代碼文件)<?php
// array.php
return [
'key1' => 'value1',
// ... 30,000 元素
];
?>
<?php
for ($i = 0; $i < 100; $i++) {
$arr = require __DIR__ . '/array.php';
}
// 平均耗時:12.89 秒
unserialize(file_get_contents('array.txt')) (序列化文件)<?php
// 生成緩存文件 (一次性)
file_put_contents('array.txt', serialize($hugeArray));
// 運行時載入
for ($i = 0; $i < 100; $i++) {
$arr = unserialize(file_get_contents(__DIR__ . '/array.txt'));
}
// 平均耗時:3.80 秒
| 指標 | require/include | file_get_contents + unserialize | 提升 |
|---|---|---|---|
| 耗時 | 12.89s | 3.80s | 3.4x 更快 |
| 原理 | 詞法分析 → 語法分析 → 編譯 opcode → 執行 | 讀文件 → 反序列化 (C 級循環) | |
| 內存峰值 | 高 (編譯過程佔用) | 低 (直接構建陣列) |
['k'=>'v', ...] 執行時逐個插入哈希表,涉及大量內存分配與鍵哈希計算。unserialize 是 C 實現的專用解析器,直接按二進制格式構建 zval,無中間語法樹。<?php
function loadConfig(string $name): array {
$cacheFile = sys_get_temp_dir() . "/app_config_{$name}.cache";
$sourceFile = __DIR__ . "/config/{$name}.php";
// 開發環境:源文件變化自動更新
if (APP_DEBUG || !file_exists($cacheFile) || filemtime($sourceFile) > filemtime($cacheFile)) {
$config = require $sourceFile;
file_put_contents($cacheFile, serialize($config), LOCK_EX);
return $config;
}
return unserialize(file_get_contents($cacheFile));
}
?>
<?php
// 安裝:pecl install igbinary
$cacheKey = 'user:profile:' . $uid;
$data = Redis::get($cacheKey);
if ($data === false) {
$data = $db->query("SELECT * FROM user_profile WHERE uid=?", $uid);
Redis::setex($cacheKey, 3600, igbinary_serialize($data));
} else {
$data = igbinary_unserialize($data);
}
?>
igbinary 比 serialize 快 2-3 倍、體積減 30-50%;msgpack 更快、跨語言。
# 目錄結構
/var/www/app/ # Web 根目錄
/var/www/app/data/ # 緩存目錄 (不可直接訪問)
/var/www/app/public/ # 真正 DocumentRoot
# .htaccess in /var/www/app/data/
deny from all
require 的 PHP 文件 (歷史包袱)。php artisan config:cache 生成單文件 bootstrap/cache/config.php (實際是 return unserialize(...) 形式)。composer dump-autoload -o 生成陣列映射,本質同理。大數據結構緩存:拒絕 require PHP 文件,擁抱序列化文件/Redis + 高效序列化器。這不僅快 3 倍以上,還能將緩存目錄隔離在 Web 根目錄外,兼顧安全。下次見到 var_export($arr, true) 寫入 .php 緩存,請果斷重構為 serialize() / igbinary_serialize()。