ThinkPHP 3.2 查询缓存默认不启用,需显式调用cache()才生效;关闭即不调用该方法,并禁用字段缓存(DB_FIELDS_CACHE=>false)和缓存驱动(DATA_CACHE_TYPE=>'None')。

ThinkPHP 3.2 的 SQL 查询缓存默认是**按需开启**的,它不会自动为所有查询启用缓存;只有显式调用 cache() 方法时才生效。所以“关闭查询缓存”本质上是指:**不调用缓存方法 + 确保相关配置不触发隐式缓存**。
确认查询未主动启用缓存
检查你的模型或 Db 查询代码中是否含有 cache() 调用。只要没写这行,就默认不走查询缓存:
-
❌ 错误(启用了缓存):
$data = M('user')->cache(true)->select(); -
✅ 正确(无缓存):
$data = M('user')->select(); - 即使写了
cache(false)或cache(null),部分版本行为不稳定,建议直接删掉整行cache(...)调用
禁用字段结构缓存(避免表结构变更后读不到新字段)
字段缓存(DB_FIELDS_CACHE)是独立于 SQL 查询缓存的机制,默认开启,会缓存数据表字段名和类型。开发中改了数据库字段却查不到,往往就是它在作怪:
- 在
Conf/config.php中添加配置项:'DB_FIELDS_CACHE' => false, - 或者临时清除已有缓存:删除
Runtime/Data/_fields/目录下对应表的缓存文件,或整个清空Runtime/Data/ - 也可在代码中手动刷新:
M('user')->getFields();(强制重查字段)
停用全局缓存驱动(可选,彻底断开缓存依赖)
如果你希望连缓存系统本身都“不可用”,防止误配或插件间接启用:
立即学习“PHP免费学习笔记(深入)”;
- 修改
Conf/config.php:'DATA_CACHE_TYPE' => 'None', - 或设为空字符串:
'DATA_CACHE_TYPE' => '', - 注意:
None驱动在 TP3.2 中是内置支持的,调用S()或cache()会静默失败,不报错也不写入
验证是否真正关闭
最直接的方式是观察运行时行为:
- 修改数据库某条记录,在页面刷新后立即看到变化 → 说明没走查询缓存
- 查看
Runtime/Temp/目录下是否生成新的.php缓存文件(尤其是以md5(查询语句)命名的文件)→ 没生成即未缓存 - 开启调试模式(
APP_DEBUG => true),日志中不会出现 “Use cache: xxx” 类提示



















