thinkphp5查询缓存默认不开启,必须手动调用cache()方法且确保config/cache.php配置正确;支持db和model链式查询,但关联、聚合及软删除场景需谨慎处理,增删改后须手动清理缓存。

ThinkPHP 5 查询缓存不是默认开启的,必须手动在查询链中调用 cache() 方法,同时确保底层缓存驱动已正确配置并可用。光配好 Redis 或 File 缓存,但不显式调用 cache(),数据库查询依然不会被缓存。
控制器中启用查询缓存
在 Db 类或模型查询中,把 cache() 插入到连贯操作里即可生效,它支持 select()、find()、value()、column() 等方法:
-
基础用法(使用默认缓存配置 + 1小时有效期):
Db::name('article')->where('status', 1)->cache(true, 3600)->select(); -
指定缓存键(避免不同查询共用同一 key):
Db::name('user')->where('id', 123)->cache('user_123', 600)->find(); -
模型中同样适用:
UserModel::where('status', 'active')->cache('active_users', 1800)->select();
确认缓存驱动已正确配置
查询缓存依赖全局缓存系统,必须存在有效的 config/cache.php 配置文件(TP5.0/5.1 不读 app.php 中的 cache 配置):
- 文件需返回数组,必须包含
'type',如'type' => 'File'或'type' => 'Redis' - File 驱动需设置可写的
'path',推荐用runtime_path() . 'cache';不要写相对路径如./runtime/cache - Redis 驱动需确认:
php -m | grep redis有输出、host/port可达、'type'是小写'redis'(TP5.0)、密码字段留空也要写'' - 若
Cache::set('test', 'ok')返回 false 或Cache::get('test')为空,说明缓存驱动未就绪,查询缓存必然失效
注意缓存一致性与常见陷阱
TP5 的查询缓存是“写不自动失效”的,增删改操作不会主动清理相关缓存,需开发者自行管理:
- 用户登录态、权限类数据不能直接缓存,否则 A 用户数据可能被 B 用户读到;敏感接口务必加
request_cache_except排除 - 关联查询(如
with())、聚合函数(count()、sum())缓存支持有限,建议拆分为独立查询并分别缓存 - 软删除模型(
SoftDelete)缓存后,逻辑删除的数据仍可能被返回,需在查询条件中显式排除delete_time - 缓存键冲突风险高:不指定
$key时,框架按 SQL 语句生成 key,微小差异(空格、别名)可能导致重复缓存;建议关键查询都设业务前缀键,如'article_list_homepage'
验证缓存是否真正生效
不要只看页面变快了——要确认缓存文件或 Redis 键确实写入:
- File 驱动:检查
runtime/cache/下是否有新增的 PHP 文件(文件名是 MD5 值),且修改时间与首次查询吻合 - Redis 驱动:用
redis-cli执行keys *your_prefix*,确认存在对应 key(如think:query_abc123) - 临时关闭缓存对比:把
->cache(...)注释掉,观察数据库查询次数是否明显增加(可用 ThinkPHP 日志或调试工具验证) - 注意:POST 请求、带 Session/Cookie 的 GET、含路由参数但未在路由层声明
cache的,都不会命中请求级缓存,仅影响查询缓存
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











