改了 .env 没生效是因为未清除配置缓存、app_env 值非法(仅支持 local/staging/production)、或在 config 外调用 env();需按 config:clear→改.env→config:cache 顺序操作,并确保 env() 仅用于 config/*.php 文件中。

改了 .env 却没生效?不是 Laravel 不认,而是你跳过了加载时机、缓存机制和类型解析这三道关卡。
为什么改了 .env 但 config('app.debug') 还是旧值
Laravel 启动时只读一次 .env,之后所有配置都来自 config/*.php 中的 env() 调用结果。一旦运行过 php artisan config:cache,这些值就被固化进 bootstrap/cache/config.php —— 此后改 .env 完全无效。
- 验证是否已缓存:检查
bootstrap/cache/config.php是否存在且非空 - 必须按顺序操作:
php artisan config:clear→ 修改.env→ 再运行php artisan config:cache - 开发中建议禁用
config:cache;生产环境必须启用,否则每次请求都重新解析.env,有性能损耗且不安全
env() 和 config() 到底该在哪儿用
env() 只在配置加载阶段有效,且仅限于 config/*.php 文件内;业务代码里直接调用 env('DB_HOST') 是危险操作,缓存后必然返回 null。
- ✅ 允许:
'host' => env('DB_HOST', '127.0.0.1')出现在config/database.php里 - ❌ 禁止:
env('API_KEY')出现在控制器、中间件、模型或 Artisan 命令中 - 正确路径:在
config/services.php定义'api_key' => env('API_KEY', ''),再用config('services.api_key') - 敏感值(如数据库密码)不要设默认值,留空即可,避免 fallback 到错误凭据
APP_ENV 设错导致 .env 根本不加载
APP_ENV 不只是个标记,它控制 Dotenv 是否加载 .env 文件。Laravel 只认 local、staging、production 这三个值 —— 写成 dev、development 或 test,.env 就会被跳过,所有 env() 返回 null。
- 合法值定义在
Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php,核心判断是in_array($app->environment(), ['local', 'staging', 'production']) - 改完
APP_ENV后,必须重启 PHP-FPM 或 Web 服务器(如 Nginx),否则$_SERVER['APP_ENV']不更新 - 别依赖
.env.production这类多文件;Laravel 默认只读.env;多环境应靠 CI/CD 注入或服务器级环境变量覆盖
布尔值、数字、空格写法不对,env() 返回值就“假得离谱”
vlucas/phpdotenv 解析规则严格:不加引号的 true、false、null、123 会被当成 PHP 字面量,导致类型丢失。
- 错误写法:
ENABLE_FEATURE=false→env('ENABLE_FEATURE')返回字符串"false",if (env('ENABLE_FEATURE'))永远为真 - 正确写法:
ENABLE_FEATURE='false',然后用filter_var(env('ENABLE_FEATURE'), FILTER_VALIDATE_BOOLEAN) - 数字也建议加引号:
API_TIMEOUT='30',避免被误解析成浮点或科学计数法 - 空格敏感:
APP_NAME= My App会导致值变成"My",必须写成APP_NAME="My App"或APP_NAME='My App'
最常被忽略的是:Laravel 的 .env 机制不是“动态配置中心”,它介入早、固化强、类型弱。所有“明明改了却没用”的问题,几乎都卡在缓存未清、APP_ENV 不合法、或在错误位置调用了 env()。











