信息发布→ 登录 注册 退出

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

发布时间:2026-01-09

点击量:

本文介绍一种健壮、兼容性强的 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;
  • 鲁棒性强:自动跳过空行、注释行(# 开头),并可选剥离引号;
  • 错误友好:添加文件存在性检查与异常提示,便于调试。

⚠️ 注意事项

  • .env 文件绝不应提交至版本库,务必加入 .gitignore;
  • 生产环境建议使用环境变量替代 .env(如通过 Web 服务器或容器注入),更安全高效;
  • 若需深度集成(如自动注入 $_ENV/$_SERVER),可进一步封装为 Composer 包(参考 vlucas/phpdotenv 原理)。

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

标签:# 封装  # 则会  # 因其  # 自定义  # 第一个  # 是一个  # 首个  # 可选  # 多个  # 跳过  # include  # php  # 关联数组  # strpos  # yy  # 键值对  # 配置文件  # 环境变量  # app  # composer  # git  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!