thinkphp系统配置缓存指将config/下php配置文件编译为runtime/config.php以跳过重复解析,修改配置后需执行php think clear:config清理,否则config()返回旧值或null;它独立于cache类数据缓存。

ThinkPHP 的“系统配置缓存”不是指 Cache 类操作的数据缓存,而是指框架自身读取的配置文件(如 config/app.php、config/cache.php 等)被编译为 PHP 文件后加载,从而跳过重复解析 YAML/PHP 数组的开销。它不依赖 Redis 或 file 缓存驱动,也不受 Cache:: 方法影响——配错这里,config('cache.default') 可能返回空,但 Cache::get() 仍可能正常工作。
为什么 config() 返回 null 或旧值?先清配置缓存
ThinkPHP 6+ 默认会将所有 config/ 下的 PHP 配置文件合并、解析后写入 runtime/config.php。这个文件只在首次访问或执行命令时生成,后续请求直接 require 它。一旦你改了 config/cache.php 却没清理,config('cache.stores.redis.host') 就还是旧值。
- 必须执行:
php think clear:config(注意是冒号,不是空格) - 该命令会删掉
runtime/config.php,下次请求自动重建 - 别手动删
runtime/config.php后就以为完事了——框架不会自动重生成,得触发一次请求或再跑一遍命令 - 若用 Swoole / Hyperf 模式长期运行,改配置后必须 reload 进程,否则
runtime/config.php被常驻内存缓存,命令也无效
config/cache.php 里哪些字段真会影响 Cache:: 行为?
很多人以为只要写了 'type' => 'redis' 就够了,其实 Cache:: 是否能用、用的是哪个 store,取决于三处联动:
-
'default' => 'redis':必须是字符串,且和stores键名完全一致(大小写敏感),不能是'Redis'或'REDIS' -
'stores'['redis']['type'] => 'redis':这个'redis'是驱动标识符,必须小写;若写成'Redis',会报Driver [redis] not supported -
'stores'['redis']['host']和'port'必须可连通——Docker 环境填'127.0.0.1'肯定失败,得换'host.docker.internal'或宿主机网关 IP - 漏掉
'password'字段(即使为空)会导致某些版本连接失败;显式写''更稳妥
改完配置却 Cache::get() 还是 null?检查这三点
这不是代码问题,而是缓存根本没写进去,或写进去了但读不到:
- 确认没在 TP6+ 项目里混用已废弃的
S('key', $val)——它只在 TP5 存在,TP6 调用会静默失败 - 如果你用了
Cache::store('redis')->get('key'),但config/cache.php里没定义stores.redis块,框架会 fallback 到默认驱动(可能是file),导致你在 Redis 里查不到 - 键名含空格、斜杠、中文?
file驱动下会生成非法文件路径,写入失败无报错;redis驱动虽能存,但前缀(prefix)若为空,不同模块 key 可能冲突;建议统一用md5($key)或只含字母数字下划线的命名
配置缓存和数据缓存是两层机制:前者决定框架“知道什么”,后者决定应用“记住什么”。改配置不清理 runtime/config.php,就像换了导航地图却不重启车载系统——它还在按旧路走。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











