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
相关产品推荐
相关产品推荐

