php原生不支持读取.env文件,必须用vlucas/phpdotenv库;需确保php版本、扩展、路径和加载时机四者匹配,否则变量静默失效:如入口在public/index.php时应传__dir__.'/..',且必须启用mbstring和fileinfo扩展。

PHP 原生不支持读取 .env 文件,必须用 vlucas/phpdotenv,且加载时机、路径、PHP 版本和扩展四者必须对齐,否则会静默失败——变量读不到,也不报错。
装不上 vlucas/phpdotenv?先核对 PHP 版本和扩展
直接 composer require vlucas/phpdotenv 报错,90% 是因为版本或扩展没配平:
- PHP 7.4 → 只能装
vlucas/phpdotenv:^4.3(^4.0不兼容) - PHP 8.0+ → 推荐
vlucas/phpdotenv:^6.0(^5.0已不维护) - 必须启用
mbstring和fileinfo扩展:运行php -m | grep -E '^(mbstring|fileinfo)$',无输出就去php.ini解开对应extension=行 - Docker / CLI / PHP-FPM 的
php.ini可能不同,改完要重启服务
Dotenv::createImmutable() 路径写错,.env 就白放了
createImmutable() 默认只查你传入路径下的 .env,不会向上递归。入口在 public/index.php,__DIR__ 指向 public/,但 .env 在项目根目录,这时必须写:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__.'/..');
常见错误:
-
file .env显示 “UTF-8 Unicode (with BOM) text” → 重存为无 BOM -
DB_HOST = localhost(等号前后有空格)→ 整行被跳过,当成注释 - 变量名含点号:
REDIS.HOST不会被识别,得手动putenv('REDIS.HOST=localhost')
为什么 getenv('APP_ENV') 返回 false?别用 $_ENV
$_ENV 是否可用取决于 PHP 配置 variables_order,默认不含 E,所以它经常为空;而 getenv() 总是可靠:
$env = getenv('APP_ENV') ?: 'production';
注意:
-
getenv()对大小写敏感,APP_ENV≠app_env - 字符串
'true'/'false'不会自动转布尔,要用filter_var(getenv('DEBUG'), FILTER_VALIDATE_BOOLEAN) -
putenv()设置的变量对getenv()可见,但不会同步进$_ENV,混用易混乱
.env 文件本身的安全红线
再安全的加载逻辑也救不了放错地方的密钥:
-
.env必须加进.gitignore,并执行git rm --cached .env清除历史追踪 - 提供
.env.example,内容只含占位符:DB_PASSWORD=your_password_here,绝不带真实值 - 生产环境应禁用
.env加载,改用系统级环境变量(如 Docker-e、Nginxfastcgi_param),避免文件权限或路径意外暴露
最常被忽略的是:CLI 和 Web 入口必须各自独立加载 Dotenv,不能共用一份 load() 调用——CLI 环境可能已有冲突变量,覆盖后导致 Web 请求拿错配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











