laravel 缓存配置导致修改 .env 或 database.php 无效,需执行 php artisan config:clear 清除 bootstrap/cache/config.php;若已运行 config:cache,则 env() 不再生效,且必须确保 bootstrap/cache 可写。

改了 .env 或 config/database.php 却仍连老库,基本不是配置写错了,而是 Laravel 缓存了旧配置——它根本没读你刚改的值。
php artisan config:clear 必须先跑
Laravel 启动时会把所有 config/ 下的文件(包括从 .env 解析出的值)编译进 bootstrap/cache/config.php。只要这个缓存存在,改 .env 就完全无效。
- 每次改完
.env,必须手动执行php artisan config:clear - 如果项目已部署,还要确认
bootstrap/cache/目录可写,否则命令会静默失败 - 有些 CI/CD 流程会自动运行
config:cache,这时光清缓存不够,得先config:clear再config:cache
Apache + PHP-NTS 混合部署导致 getenv() 失效
在本地用 Apache + 线程安全版 PHP(TS)时,getenv() 和 putenv() 会因线程共享环境变量而出错——你改了 .env,但某个请求可能读到另一个请求写入的旧值。
- 现象:两个 Laravel 项目共用一个 Apache 实例,其中一个改了数据库配置,另一个接口却连上了它的库
- 验证方式:在路由里加
dd(getenv('DB_DATABASE')),看输出是否和.env一致 - 临时解法:在
config/database.php中绕过env(),直接写死配置,比如'database' => 'my_app_production' - 根治办法:换用 PHP-NTS 版本,或把 Apache MPM 改为
prefork
config:cache 后 env() 不再生效
一旦运行过 php artisan config:cache,Laravel 就不再调用 env() 函数,所有 env() 调用都会返回 null(除非你在 config:cache 前已通过 putenv() 预设好值)。
- 检查是否缓存过:看
bootstrap/cache/config.php文件是否存在且非空 - 如果你依赖
.env动态切换环境(比如本地开发 vs Docker),就别用config:cache;生产环境用了它,就得确保.env在部署前已正确注入 - 常见误操作:CI 脚本里写了
config:cache,但没清掉上一次的缓存,导致旧配置残留
真正容易被忽略的是:Laravel 的配置加载顺序是 .env → config/*.php → config:cache 文件,而 config:cache 是个单向快照——它不监听文件变化,也不感知 .env 修改。你改的不是配置,只是“还没被读取的文本”。











