ThinkPHP 8.0 配置机制全面重构:配置文件须扁平化置于 config/ 根目录,.env 优先覆盖顶层键,app_debug 决定是否启用配置缓存,修改后必须执行 php think config:cache 生效,runtime/config.php 是实际生效的唯一配置源。

配置文件本身不用改内容,但加载方式、缓存行为和路径约定全变了——直接改 config/app.php 里的值,大概率不生效。
config/ 目录结构必须扁平化
ThinkPHP 8.0 不再支持 config/ 下嵌套子目录(如 config/database/mysql.php)。所有配置文件必须放在 config/ 根目录下,且文件名要与配置分组名一致:
-
database.php→ 对应config('database') -
cache.php→ 对应config('cache') - 自定义配置如
api.php→ 必须手动加载:Config::load('api.php', 'api'),否则框架完全忽略 - 若旧项目有
config/extra/或config/test/这类结构,全部移出并重命名到根目录
app_debug 和配置缓存强绑定
config/app.php 中的 app_debug 值决定配置是否走缓存:
-
'app_debug' => true:每次请求都重新require所有配置文件,改完即生效(开发可用,但上线必须关) -
'app_debug' => false:框架会读取runtime/config.php,此时改config/app.php没用 - 修改后必须执行
php think config:cache重建缓存,否则config()返回旧值 - 如果
runtime/不可写,config:cache静默失败,需先chmod -R 755 runtime/
.env 文件覆盖规则更严格
.env 不再是“补充”,而是优先级最高的配置源,但只覆盖顶层键(不能嵌套):
立即学习“PHP免费学习笔记(深入)”;
-
APP_NAME=MyApp→ 覆盖config/app.php中的'app_name' -
LOG_LEVEL=debug→ 覆盖config/log.php中的'level' -
database.type=mysql写法无效 ——.env不支持点号嵌套,只能写DB_TYPE=mysql并在代码中映射 - 确认是否被覆盖:在控制器里打印
var_dump($_ENV['APP_DEBUG'] ?? null),再对比config('app.debug')
runtime/config.php 是真配置源,不是中间产物
这个文件是框架实际运行时读取的唯一配置快照,不是临时缓存:
- 它由
php think config:cache生成,合并了.env、config/*.php和运行时动态设置 - 手动编辑
runtime/config.php是危险操作,下次config:cache会被覆盖 - 若发现配置异常,优先检查该文件内容是否符合预期(比如是否有语法错误、是否漏掉了你新增的
api.php) - 删掉它 ≠ 清除缓存,必须配合
php think config:clear才能重置容器内已加载的配置实例
最容易被忽略的是:即使你把所有配置文件改对了,只要没跑 php think config:cache(或没设 app_debug=true),框架就永远读不到新值。runtime/config.php 的存在感极低,但它才是最终拍板的那个。



















