必须执行 php artisan config:clear,因为 laravel 启动时优先读取 bootstrap/cache/config.php 缓存文件,跳过 .env 和 config/ 下原始配置,导致新配置完全不生效。

改完 .env 或配置文件后,必须执行 php artisan config:clear,否则新配置完全不生效。
为什么只清 config:clear 就够了
因为 Laravel 启动时会把 config/ 下所有 PHP 配置文件合并写入 bootstrap/cache/config.php。只要这个缓存文件存在,框架就跳过读取 .env 和原始配置文件——哪怕你刚改完 .env,env('DB_HOST') 依然返回旧值。
常见表现:
-
DB_CONNECTION没变,连的还是 sqlite 而不是 mysql -
APP_DEBUG=true改了但错误页仍不显示详细信息 -
MAIL_FROM_ADDRESS更新后邮件发件人没变化
哪些情况要额外清其他缓存
单纯改数据库或 APP 相关配置,config:clear 是底线操作;但以下场景需顺手多清几项:
- 改了路由定义(如
routes/web.php)→ 加上php artisan route:clear - 改了 Blade 模板里的逻辑或语言包 → 加上
php artisan view:clear - 升级 Laravel 版本(尤其是跨大版本,比如 12 → 13)→ 必须连带执行
php artisan clear-compiled,否则服务提供者绑定失败 - 生产环境部署后想提速 → 清完再跑
php artisan config:cache和php artisan route:cache(开发环境别用config:cache)
容易被忽略的三个坑
.env 文件本身的问题比配置项写错更常导致失败:
- Windows 编辑器保存时带 BOM 头,
env()解析直接失败,DB_HOST变成null -
.env末尾有空行或空格,某些版本的v5.8+会截断后续变量 - 改完没清缓存,又顺手跑了
php artisan cache:clear—— 这个命令不清配置缓存,纯属白忙活
最简验证方式:改完 .env,执行 php artisan config:clear,然后运行 php artisan tinker,输入 config('database.default') 看是否已更新。别跳过这一步,缓存机制不会“自动感知”文件改动。











