thinkphp 5.1.41默认不开启模型缓存,需同时满足缓存驱动就绪、数据库配置启用query_cache、查询方式为支持缓存的读取方法(如select/find)三个条件才能生效。

ThinkPHP 5.1.41 默认不开启模型缓存,需手动配置数据库连接的 resultset_type 和启用查询缓存机制。模型缓存(即查询结果缓存)本质是将 Db::name('user')->select() 这类查询结果自动存入缓存驱动(如 file、redis),下次相同 SQL 执行时直接返回缓存数据,避免重复查库。
要真正生效,需同时满足三个条件:缓存驱动就绪、数据库配置开启缓存、查询方式支持缓存。
-
确认缓存驱动已配置且可用
编辑config/cache.php,确保至少有一个可用缓存类型(如 redis 或 file)。例如启用 redis 缓存:'redis' => [ 'type' => 'redis', 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'prefix' => 'tp5:', 'expire' => 3600, ],并确认 PHP 已安装并启用
redis扩展(运行php -m | grep redis可验证)。 -
在数据库配置中启用查询缓存
修改config/database.php,在连接配置中添加'resultset_type' => 'array'(非必须,但推荐)和关键项'query_cache' => true:'query_cache' => true, // 开启查询缓存总开关 'query_cache_type' => 'redis', // 指定缓存驱动名(对应 cache.php 中的键名) 'query_cache_key' => '', // 可留空,系统自动生成;也可设为固定前缀如 'model:' 'query_cache_expire' => 3600, // 缓存过期时间(秒)
-
使用支持缓存的查询方式
模型缓存仅对select()、find()、value()、column()等「读取类」方法生效,且要求:不含
->cache(false)显式关闭;SQL 无动态变量拼接(如
where('id', $id)✅,where("id = $id")❌);-
推荐用模型调用而非 Db 类直查(模型自动继承缓存配置):
// ✅ 生效(假设 User 模型已定义) $users = \app\model\User::all(); // ✅ 也生效(Db 查询 + 显式指定缓存) $list = \think\Db::name('user')->cache(true, 300)->select();
验证是否命中缓存
开启debug模式(config/app.php中'debug' => true),查看日志或浏览器调试栏中的 SQL 面板:若某条查询后标注[CACHE]或响应头含X-Think-Cache: HIT,说明缓存已起作用。
不复杂但容易忽略的是:query_cache 必须在数据库连接层开启,而不是仅配好 cache.php 就行;且默认 query_cache_type 是空字符串,不填则回退到默认缓存驱动(通常是 file),但 file 缓存性能弱、并发差,生产环境建议明确指定为 redis。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











