必须清理 runtime/config.php,否则改 .env 无效;ThinkPHP 启动时合并配置并写入该文件,存在即直接加载,不重新解析 .env;清缓存需用 php think config:cache(生产)、开启 app_debug(开发)或 rm -f runtime/config.php + php think config:clear(彻底)。

要清,而且必须清——不清理 runtime/config.php,改了 .env 也完全无效。
为什么改了 .env 还是读不到新值
ThinkPHP 的配置加载不是“边读边用”,而是启动时把 .env、config/*.php 和运行时设置全部合并,一次性写进 runtime/config.php。只要这个文件存在且可读,框架就直接 require 它,根本不会重新解析 .env。
-
env('DB_HOST')返回旧值?大概率是runtime/config.php里还存着上一轮的合并结果 - 哪怕你确认
.env在项目根目录、权限正常、键名拼写无误,缓存不清理照样白改 - CLI 下执行
php think clear不会动runtime/config.php,它只清cache/和log/
清配置缓存的三种可靠方式
别只删文件,得匹配当前环境和目的:
- 生产环境(
app_debug = false):执行php think config:cache,它会强制重生成runtime/config.php,并校验合并逻辑是否完整 - 开发环境(临时调试):把
config/app.php中的'app_debug' => true,此时框架跳过缓存,每次请求都重新加载源文件 - 最彻底的手动清理:先
rm -f runtime/config.php,再运行php think config:clear,后者会触发容器内配置实例的 reset 逻辑,比单删文件更干净
容易被忽略的覆盖点
.env 的优先级虽高,但有些地方它压根不生效:
立即学习“PHP免费学习笔记(深入)”;
-
APP_ENV=prod被 shell 环境变量提前设定了(比如export APP_ENV=prod),会覆盖.env里的APP_ENV;可在控制器中对比getenv('APP_ENV')和env('APP_ENV')验证 -
config/database.php里写了硬编码的'hostname' => '192.168.1.100',而.env写的是DB_HOST=127.0.0.1——没问题,DB_HOST会覆盖hostname;但如果.env漏写了DB_HOST,那框架不会 fallback 到config/database.php,而是用空值 -
runtime/目录不可写(比如部署时权限锁死),php think config:cache会静默失败,runtime/config.php保持原样不动
真正卡住人的从来不是“会不会清”,而是清完没验证 runtime/config.php 是否更新、没检查环境变量是否被更高优先级覆盖、也没确认 runtime 目录写权限是否到位。



















