ThinkPHP缓存需合理配置驱动、序列化方式及清理策略:生产环境用Redis并设前缀,禁用文件缓存;优先JSON序列化;缓存内容要轻量可预测;用标签精准清理,模板缓存必须开启。

ThinkPHP 缓存机制用对了,能显著降低数据库压力、加快响应速度;用错了,反而拖慢系统甚至引发数据错乱。核心不是“开不开”,而是“怎么配、怎么存、怎么清”。
选对缓存驱动,别让文件缓存扛高并发
开发环境可用 file 驱动快速验证逻辑,但上线必须切到 Redis 或 Memcached。文件缓存在单机小流量下尚可,一旦缓存项超 5000 个,Linux 文件系统单目录 I/O 就会明显下降;而 Redis 基于内存读写,毫秒级响应,还支持分布式共享。
- 生产环境配置
'default' => 'redis',并在config/cache.php中填好 host、port、密码等参数 - 避免多个服务共用同一 Redis 实例却不设前缀——加
'prefix' => 'app_v2_'防键名冲突 - 文件缓存若必须用,启用两级子目录:
'level' => 2,让 runtime/cache/a/b/xxx.php 分散存储压力
序列化方式比驱动本身更影响性能
默认用 serialize() 存数组或对象,生成字符串冗长,反序列化时还要重建符号表和处理引用,CPU 和内存开销都高。尤其缓存商品列表、配置树这类大数组时,unserialize() 往往成瓶颈。
- 优先改用
json_encode()+json_decode($content, true),前提是数据不含资源句柄、闭包、私有属性 - 若必须缓存带魔术方法的模型实例,先用
get_object_vars()提纯为关联数组再 JSON 处理 - 确认
opcache.enable = 1,避免每次反序列化都重新加载解析逻辑
缓存内容要“轻量”且“可预测”
缓存不是垃圾桶,不能啥都往里塞。Paginator 对象含数据库连接和闭包,反序列化后不可用;搜索结果若只拼 $_GET['q'] 当键,漏掉分页、排序等参数,会导致缓存污染。
立即学习“PHP免费学习笔记(深入)”;
- 分页数据拆成
data数组 +total整数分别缓存,不存整个 Paginator 实例 - 搜索类缓存键必须包含全部参数哈希:
'search_result_' . md5(http_build_query($_GET)) - 用户登录态、订单状态等敏感数据,TTL 控制在 60–300 秒内,靠主动删除(
Cache::delete('user_token_123'))比依赖过期更可靠
善用标签与批量操作,别一删全清
Cache::clear() 是“核按钮”,会清空整个 store,可能误删 session 或配置缓存,导致系统异常。
- 给缓存打标签:
->cache(['tag' => 'user_list'], 3600),之后用Cache::tag('user_list')->clear()精准清理 - 高频读写场景(如计数器),用 Redis 原生命令
incr/decr,比 set/get + 重算更原子、更高效 - 模板缓存必须开启:
'tpl_cache' => true,并关掉app_debug,否则每次请求都重编译,缓存形同虚设



















