改了 .env 没生效,核心是清缓存、验环境、对位置:先 config:clear,再改 .env,最后 config:cache;app_env 必须为 local/staging/production 且重启服务器;env() 仅限 config/*.php 中使用,业务代码应调用 config()。

改了 .env 却没生效,不是 Laravel 不读,而是它根本没“重新加载”——缓存锁住了旧值、环境标识不被识别、或调用位置错了。核心就三点:清缓存、验环境、对位置。
先清配置缓存再改 .env
一旦运行过 php artisan config:cache,Laravel 就把所有配置固化进 bootstrap/cache/config.php,此后 .env 的任何修改都无效。
- 必须按顺序执行:
php artisan config:clear→ 修改.env→ 再运行php artisan config:cache - 验证是否已缓存:检查
bootstrap/cache/config.php是否存在且内容非空 - 开发阶段建议禁用
config:cache;生产环境必须启用,否则每次请求都解析.env,既慢又不安全
确保 APP_ENV 值合法且已生效
APP_ENV 不是标签,是开关。Laravel 只认 local、staging、production 这三个值。写成 dev、test 或 development,.env 直接被跳过。
- 检查
.env中APP_ENV=local(或对应合法值),等号前后不能有空格 - 改完
APP_ENV后,必须重启 PHP-FPM 或 Web 服务器(如 Nginx),否则$_SERVER['APP_ENV']不更新 - 多环境别依赖
.env.production等文件;Laravel 默认只读.env,跨环境靠 CI/CD 注入或系统级变量覆盖
env() 只能在 config/*.php 里用
env() 是启动时的“一次性读取函数”,不是运行时 API。在控制器、中间件、命令、视图里直接调 env('API_KEY'),缓存后必返回 null。
- ✅ 正确:在
config/services.php中写'api_key' => env('API_KEY', '') - ✅ 然后在业务代码中用
config('services.api_key') - ❌ 禁止:在任何非配置文件中出现
env()调用 - 敏感值(如数据库密码)不要设默认值,留空即可,避免 fallback 到错误凭据
注意布尔值和数字的写法
vlucas/phpdotenv 解析严格:不加引号的 true、false、null、123 会被当 PHP 字面量处理,类型丢失。
- 错误写法:
ENABLE_FEATURE=false→env('ENABLE_FEATURE')返回字符串"false",if (env('ENABLE_FEATURE'))恒为真 - 正确写法:
ENABLE_FEATURE="false"(加双引号)或ENABLE_FEATURE=false+ 在代码中显式判断env('ENABLE_FEATURE') === 'true' - 空格、特殊字符务必用单引号包裹,例如:
MAIL_PASSWORD='my p@ss w0rd'











