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