本文介绍一种健壮、兼容性强的 php 方法,用于读取无节标题的 `.env` 类型配置文件(如 `key=value`),正确处理含多个等号的值(如 base64 密钥),最终生成标准关联数组。
.env 文件虽看似简单(每行 KEY=VALUE),但直接使用 parse_ini_file() 会失败——因其默认要求 INI 格式需包含节(如 [section]),而 .env 是无节纯键值对;include() 则会尝试执行代码,存在严重安全隐患且无法返回数组。因此,需手动解析。
以下是一个生产就绪的解析方案,核心逻辑是:逐行读取 → 跳过空行与注释 → 对每行精准分离首个 = 前后的键与值(避免误切 base64、JWT 等含多 = 的值):
function loadDotEnv($filepath) {
if (!file_exists($filepath)) {
throw new InvalidArgumentException("Environment file not found: {$filepath}");
}
$data = [];
$lines = file($filepath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
// 跳过
注释行(以 # 开头)
if (trim($line) === '' || strpos(trim($line), '#') === 0) {
continue;
}
// 定位第一个等号位置,确保 value 可含多个 =
$pos = strpos($line, '=');
if ($pos === false) {
continue; // 跳过无效行(无等号)
}
$key = trim(substr($line, 0, $pos));
$value = trim(substr($line, $pos + 1));
// 可选:去除 value 两端引号(支持 "value" 或 'value')
if (preg_match('/^["\'](.*)["\']$/', $value, $matches)) {
$value = $matches[1];
}
$data[$key] = $value;
}
return $data;
}
// 使用示例
$env = loadDotEnv(__DIR__ . '/../../.env');
print_r($env);✅ 关键优势说明:
⚠️ 注意事项:
该方法轻量、透明、可控,是理解底层原理与构建自定义配置加载器的理想实践。