如何在 PHP 中安全解析 .env 格式(X=Y)配置文件并转为关联数组

11次阅读

如何在 PHP 中安全解析 .env 格式(X=Y)配置文件并转为关联数组

本文介绍一种健壮、兼容性强的 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 原理)。

该方法轻量、透明、可控,是理解底层原理与构建自定义配置加载器的理想实践。

text=ZqhQzanResources