ThinkPHP缓存需正确配置驱动类型、连接参数和调用方式三层,任一错误都会导致Cache::get()静默返回null;file适合单机调试,redis适合多实例高频场景;务必检查目录权限、键名合法性及store配置一致性。

ThinkPHP 缓存不是“开个开关”就完事的,它分三层:驱动类型、连接参数、调用方式。配错任意一层,Cache::get() 就会静默返回 null,而你查数据库查得毫无察觉。
缓存驱动选 file 还是 redis?看场景,别默认
开发环境或小流量后台,默认 file 没问题——不依赖外部服务,runtime/cache/ 目录写入即可。但上线后如果并发稍高,文件锁争用会导致请求排队,响应明显变慢。
-
file适合:单机部署、调试验证、低频读取配置类数据(如系统参数) -
redis适合:多实例部署、高频热点数据(用户会话、商品列表)、需要原子操作(inc()/dec()) - 别在
config/cache.php里写死'type' => 'redis'却没装扩展——PHP 会报Class 'Redis' not found,且不会提示缓存失效,只会退化成空逻辑
cache.php 配置项哪些必须填?哪些能省?
ThinkPHP 6+ 的缓存配置集中在 config/cache.php,关键字段不是越多越好,而是按需填准:
-
'default'必须明确指定驱动名,比如'redis',否则即使'stores'['redis']写全了也用不上 -
'host'和'port'在redis驱动下必须可连通;本地测试常填'127.0.0.1',但 Docker 环境得换'host.docker.internal'或宿主机 IP -
'prefix'建议设非空值(如'tp6_'),避免多个项目共用 Redis 时键名冲突 -
'expire'设为0表示永不过期,但 Redis 内存有限,慎用;设为负数(如-1)在部分旧版 TP 中会被忽略,建议统一用正整数秒
为什么 Cache::get() 总是返回 null?先查这三处
这不是代码写错了,大概率是缓存根本没写进去,或写进去了却读不到——常见于路径、权限、作用域错位:
- 检查
runtime/cache/目录是否存在且 PHP 进程有写权限;若改过'path',确认路径是**绝对路径**或相对于项目根目录的正确相对路径(如'../data/cache/') - 确认没在控制器里用
S('key', $val)(TP5 早期函数),而在 TP6+ 中混用——S()已废弃,只认Cache::set() - TP6 支持多 store,如果你用了
Cache::store('redis')->get('key'),但配置里没定义'redis'store 或拼错名字,就会 fallback 到默认驱动(可能是 file),导致跨 store 读不到
最易被忽略的一点:缓存键名本身带特殊字符(如空格、斜杠、中文)在 file 驱动下会生成非法文件名,写入失败却无报错;用 md5($key) 或规范命名(只含字母、数字、下划线)是简单有效的兜底方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










