
本文介绍一种健壮、兼容性强的 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);✅ 关键优势说明:
- ✅ 安全可靠:不调用 eval、include 或 create_function,杜绝代码注入风险;
- ✅ 兼容复杂值:通过 strpos() 定位首个 =,完美支持 APP_KEY=base64:xxx=yyy=zzz;
- ✅ 鲁棒性强:自动跳过空行、注释行(# 开头),并可选剥离引号;
- ✅ 错误友好:添加文件存在性检查与异常提示,便于调试。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- .env 文件绝不应提交至版本库,务必加入 .gitignore;
- 生产环境建议使用环境变量替代 .env(如通过 Web 服务器或容器注入),更安全高效;
- 若需深度集成(如自动注入 $_ENV/$_SERVER),可进一步封装为 Composer 包(参考 vlucas/phpdotenv 原理)。
该方法轻量、透明、可控,是理解底层原理与构建自定义配置加载器的理想实践。











