ThinkPHP 5.1 应通过 Cache::get() 或 cache('key') 调用缓存,避免直接 new 驱动类;TP6 需安装 think-cache 扩展并注册 CacheProvider,配置结构、Tag 机制及 Redis 参数均不兼容 TP5.1。

ThinkPHP 5.1 中如何正确调用 Cache 类
TP5.1 默认使用 think\Cache 作为门面类,但实际底层驱动已拆分为独立类(如 think\cache\driver\File),不能直接 new 实例再调用 get() 或 set() —— 这会跳过缓存配置、前缀、序列化等关键逻辑。
正确做法是统一走门面或容器:
- 用
Cache::get('key')或cache('key')函数,它们自动读取config/cache.php配置并实例化对应驱动 - 若需手动指定驱动(比如临时切 Redis),用
Cache::store('redis')->get('key'),其中redis是配置文件里定义的 store 名称 - 别直接
new \think\cache\driver\Redis()后调用方法 —— 缺少初始化(init())、无自动前缀、不兼容Tag功能
ThinkPHP 6.x 的 think\facade\Cache 和驱动解耦细节
TP6 把缓存驱动彻底从核心移出,think/cache 成为独立扩展包,且默认不再内置 File 驱动(只留接口)。这意味着:装完 TP6 框架后直接调用 Cache::get() 会报错 Class "think\cache\driver\File" not found。
必须显式安装并注册驱动:
立即学习“PHP免费学习笔记(深入)”;
- 执行
composer require topthink/think-cache(官方缓存扩展) - 在
app/provider.php中添加think\provider\CacheProvider::class -
config/cache.php中的default值必须与已注册的 store 名称一致(如'file'、'redis') - TP6 不再支持
cache('key', $value, 3600)这种三参数函数式写法,只保留门面调用或cache()->get()容器方式
跨版本迁移时最常踩的坑:Tag 缓存失效
TP5.1 的 Cache::tag('user')->set('info', $data) 在 TP6 中行为不同:TP6 要求 tag 必须提前声明(cache()->tag(['user'])->set('info', $data)),且底层驱动需原生支持 tag(如 Redis 需开启 redis.use_lua,File 驱动默认不支持 tag 清理)。
常见错误现象:
- 调用
Cache::tag('user')->clear()后,预期删除的 key 依然存在 - TP5.1 下能用的 tag 写法,在 TP6 中静默失败,无报错但不生效
- 自定义驱动未实现
TagSetInterface,却在代码里硬写->tag(),运行时报Call to undefined method
建议:生产环境慎用 tag,优先用语义化 key 命名(如 user:123:profile)+ 手动批量删除。
缓存驱动配置项差异:以 Redis 为例
TP5.1 和 TP6 的 redis 驱动配置结构不兼容。TP5.1 支持扁平字段(host、port、password),而 TP6 强制要求嵌套在 redis 子键下,且部分字段名变更:
- TP5.1 配置中用
'timeout' => 0,TP6 必须写成'redis.timeout' => 0.0(类型为 float) - TP5.1 的
'select' => 0在 TP6 中变为'redis.database' => 0 - TP6 新增
'redis.prefix'字段控制 key 前缀,TP5.1 则靠全局cache.prefix统一控制 - 连接池配置(
pool)在 TP6 中是必选项,TP5.1 无此概念;漏配会导致并发高时连接耗尽,报错Connection refused
配置写错不会启动报错,但首次缓存操作时才暴露问题,容易误判为网络或 Redis 服务异常。


















