You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用vlucas/phpdotenv无法读取.env,PDO数据库连接失败

问题排查与解决

核心问题

环境变量未被正确加载,导致PDO连接时使用了无效的主机地址(调试输出显示host is %,说明getenv未获取到对应变量值)。

排查步骤与解决方案

1. 确认.env文件的位置与命名

  • 确保.env文件和你的test.php处于同一目录(即__DIR__指向的目录),文件名必须严格为.env,不能是.env.example、.env.txt或其他变体。
  • 如果.env文件在上级目录或其他路径,修改createImmutable的路径参数,例如:
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
    

2. 修正.env文件格式问题

你的.env配置中DATABASE_USERNAME=user 的值后面带有空格,虽然不影响读取,但建议统一去掉值末尾的空格,避免后续意外问题:

DATABASE_HOSTNAME=db
DATABASE_NAME=myDb
DATABASE_USERNAME=user
DATABASE_PASSWORD=test

同时确保每行都是键=值的纯净格式,不要添加多余引号或错误注释。

3. 更换环境变量读取方式

getenv在部分PHP配置环境下可能无法正常读取phpdotenv注入的变量,改用$_ENV数组直接读取:

$host = $_ENV["DATABASE_HOSTNAME"];
$dbname = $_ENV["DATABASE_NAME"];
$dbuser = $_ENV["DATABASE_USERNAME"];
$dbpass = $_ENV["DATABASE_PASSWORD"];

4. 验证.env文件是否加载成功

在加载代码后添加验证逻辑,确认加载状态:

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
// 使用safeLoad(),加载失败时会返回false
$loaded = $dotenv->safeLoad();
if (!$loaded) {
    die("无法加载.env文件,请检查文件路径或权限");
}

如果输出提示信息,说明.env文件确实无法被找到或读取。

5. 检查文件权限(Linux/macOS环境)

如果是类Unix系统,确保.env文件的权限允许PHP进程读取:

chmod 644 .env

同时确认文件的所属用户组与PHP运行进程的用户组一致。

6. 检查PHP配置

确保PHP的variables_order配置包含E(允许使用$_ENV数组),可在php.ini中查看:

variables_order = "GPCSENV"

若配置中缺少E,修改后重启PHP服务。


内容的提问来源于stack exchange,提问作者John Beasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:55:14