配置管理是應用可移植性、安全性、可維護性的基石。本文對比四種主流方案——php.ini、PHP 返回數組、XML、數據庫——並給出生產級架構建議。
| 維度 | php.ini | PHP Array | XML | Database |
|---|---|---|---|---|
| 讀取性能 | 極快(啟動加載) | 極快(OPcache) | 中(解析開銷) | 慢(網絡 IO) |
| 寫入/動態修改 | 極難(需重啟) | 困難(文件鎖、語法) | 中(DOM 寫入) | 極易(SQL) | 安全性(敏感信息) | 低(全局可讀) | 中(文件權限控制) | 中 | 高(加密列、權限隔離) |
| 版本控制友好 | 差 | 優(純代碼) | 良 | 差(需遷移腳本) |
| 多環境區分 | 困難 | 優(加載不同文件) | 中 | 優(環境標識欄位) |
| 結構化/巢狀 | 不支援 | 支援 | 支援 | 需序列化 |
config/
├── base.php # 基礎默認配置(提交 Git)
├── local.php # 本地開發覆蓋(.gitignore)
├── staging.php # 測試環境覆蓋(部署注入)
└── production.php # 生產環境覆蓋(部署注入/密管平台下發)
加載邏輯(單例/容器綁定):
class Config {
private static $data = [];
public static function load(string $env): void {
$base = require __DIR__ . '/config/base.php';
$envFile = __DIR__ . "/config/{$env}.php";
$override = file_exists($envFile) ? require $envFile : [];
self::$data = array_merge_recursive($base, $override);
// 敏感值從環境變量/密管平台覆蓋
foreach (['db_password','redis_password','api_secret'] as $key) {
if ($val = getenv(strtoupper($key))) self::$data[$key] = $val;
}
}
public static function get(string $key, $default = null) {
return self::$data[$key] ?? $default;
}
}
// 啟動時
Config::load(getenv('APP_ENV') ?: 'local');
.env 文件(vlucas/phpdotenv 加載),.gitignore 排除。database、cache、mail、storage、feature_flags。snake_case,前綴模塊名 mail_smtp_host。readonly class Config { public string $db_host; ... } 配合 spiral/config 實現類型安全。base.php 給出合理默認,環境文件僅覆蓋差異。feature_new_checkout = false,灰度發布時逐環境開啟。字體、顏色、間距等 UI 細節**屬於 CSS/主題系統**,不應進入應用配置。配置系統僅管理「行為參數、連接信息、業務閾值、功能開關」。
「PHP 返回數組 + 環境分層覆蓋 + 環境變量注入敏感值」是目前 PHP 生態**最主流、工具鏈最完善、安全性最高**的方案。配合 symfony/config、laravel/config、spiral/config 等成熟組件,可獲得驗證、熱更新、類型安全等企業級能力。