ThinkPHP 5.1.41 默认不开启数据库查询缓存,需手动调用 cache() 方法启用;支持指定缓存标识、有效期及自动 key 生成,依赖正确配置的缓存驱动(如 file 或 redis),并注意关联查询、聚合函数和软删除等限制场景。

ThinkPHP 5.1.41 默认不开启数据库查询缓存,必须显式调用 cache() 方法才能生效。它不是靠全局开关自动拦截所有查询,而是按需、手动启用。
在数据库查询链中添加 cache() 方法
这是最直接有效的方式。只要在 select()、find()、value() 等查询方法前插入 cache(),框架就会在首次执行时写入缓存,并在有效期(expire)内复用结果,跳过数据库查询。
-
基础用法:缓存 1 小时(3600 秒)
Db::name('user')->where('id', 1)->cache(true, 3600)->find(); -
指定缓存标识(推荐):避免键冲突,便于定位和清理
Db::name('user')->where('status', 1)->cache('user_list_active', 3600)->select(); -
使用默认配置+自动生成 key:
Db::name('article')->order('id desc')->limit(10)->cache(true)->select();
确认缓存驱动已正确配置
查询缓存依赖底层缓存系统(如 file、redis)。即使加了 cache(),若缓存驱动未启用或配置错误,仍会退化为直连数据库。
- 检查
config/cache.php是否存在且有效,至少包含基础配置,例如:'type' => 'file', 'path' => '../runtime/cache/' - 确保
runtime/cache/目录存在且 Web 进程有写权限(Linux 常见问题:权限不足导致静默失败) - 如使用 Redis,请确认 PHP 已安装 redis 扩展,且
cache.php中stores['redis']配置完整(host、port、password 等)
注意关联查询与聚合函数的限制
这些场景下 cache() 容易失效或行为异常,需特别处理:
立即学习“PHP免费学习笔记(深入)”;
-
with()关联查询不建议直接套用cache(),应拆分为独立缓存:
先查主表列表并缓存,再按 ID 批量查关联表并单独缓存 -
count()、sum()等聚合方法返回标量,无法链式调用cache();改用Cache::remember()封装:Cache::remember('user_total', 300, function () { return Db::name('user')->count(); }); - 软删除模型(
SoftDelete)缓存不会自动感知delete_time变更,需在逻辑删除后主动清除对应缓存
验证是否真正生效
不要只看代码有没有写 cache(),要确认缓存文件/Redis key 是否生成、数据库日志是否减少:
- 查看
runtime/cache/目录下是否有新生成的 PHP 文件(文件名含查询哈希),或 Redis 中是否存在对应 key - 开启 ThinkPHP 的 SQL 日志(
'sql_explain' => true),对比两次请求的 SQL 执行次数 - 首次请求后修改数据库数据,再次访问页面——若内容未更新,说明缓存命中;若更新了,说明未缓存或已过期



















