ThinkPHP 在 APP_DEBUG=false 时默认启用配置缓存机制,将 config/ 下 PHP 配置合并编译为 runtime/config.php 以提升性能;修改 config/app.php 不生效通常因缓存未更新、生成失败或 OPcache 导致。

因为 ThinkPHP 在 APP_DEBUG = false 时默认启用配置缓存机制,框架会把所有 config/ 目录下的 PHP 配置文件合并编译成单个 runtime/config.php,后续请求直接加载这个已编译文件,跳过原始配置的解析流程——这是性能优化设计,不是 bug。
配置缓存的触发条件
以下任一条件满足,框架就会读取缓存配置而非源文件:
-
APP_DEBUG最终值为 false(注意:.env、config/app.php、入口 define() 三处优先级叠加后结果为准) - 项目根目录下存在可读写的
runtime/config.php文件,且内容合法(非空、语法正确) - 没有手动调用
php think config:clear或删除该文件
为什么改了 config/app.php 却不生效
常见原因不是“没读到”,而是读到了旧缓存:
- 你修改了
config/app.php,但runtime/config.php还是上次生成的旧版本 - 执行
php think config:cache命令失败(如 runtime/ 不可写、PHP 版本不兼容、配置中含未定义常量),导致缓存文件未更新却仍被加载 - 服务器启用了 OPcache,把
runtime/config.php的字节码缓存住了,即使文件已更新,PHP 仍执行旧编译结果
如何确认当前读的是缓存还是源文件
在控制器里加一行调试代码:
立即学习“PHP免费学习笔记(深入)”;
var_dump(config('app.debug'), is_file(RUNTIME_PATH . 'config.php'));若输出 false 和 true,说明正在使用缓存配置;若第一个是 true,则强制走源文件,此时改配置才实时生效。
绕过缓存的临时方法
开发阶段想快速验证配置改动,最稳妥的做法是:
- 临时把
config/app.php中的'app_debug' => false改为true - 删掉
runtime/config.php(或整个 runtime/ 目录) - 确保入口文件 public/index.php 没有
define('APP_DEBUG', ...)覆盖逻辑
改完立刻生效,无需清缓存、重启服务。上线前务必改回 false 并重新生成配置缓存。



















