thinkphp5复合缓存中default是明确指定的默认store名称,必须与stores数组中已定义的键名严格一致,否则静默回退file驱动;不配置default时框架默认使用file。

ThinkPHP 5 的复合缓存(type' => 'complex')中,default 并不表示“自动选一个”,而是明确指定**默认使用的 store 名称**,它必须是 stores 数组中已定义的某个键名。
default 必须与 stores 中的键严格对应
例如以下配置:
'cache' => [
'type' => 'complex',
'default' => 'redis', // ← 这里写的是 'redis'
'stores' => [
'file' => ['type' => 'file', 'path' => RUNTIME_PATH . 'cache/'],
'redis' => ['type' => 'redis', 'host' => '127.0.0.1'],
],
],
此时所有未显式指定 store 的缓存操作(如 Cache::set('k','v'))都会走 redis 驱动。如果把 default 改成 'file',就默认走文件缓存。
⚠️ 注意:default 的值不能是任意字符串,也不可省略;若填了不存在的键(如 'memcached' 但 stores 里没定义),TP 会静默回退到 file 驱动,且不报错——这是常见排查盲点。
不配置 default 时的行为
如果整个 cache 配置中压根没写 default 键,ThinkPHP 5 会按框架内置逻辑 fallback:
- 在
config/cache.php中未定义default时,以该文件顶部的'default' => 'file'为准(这是 TP5 默认值); - 若你用的是独立配置(如通过
Cache::init()传参),且参数中无default,则同样默认使用file驱动。
如何验证当前 default 生效的是哪个 store
最直接的方式是运行一段测试代码:
dump(Cache::getDriver()); // 输出当前实际使用的驱动实例类名,如 Think\Cache\Driver\Redis dump(Cache::store()->getConfig()); // 查看当前 store 的完整配置
或者用命令行快速验证:
php -r "var_dump(cache('test_check', 'ok', 10));"
php -r "var_dump(cache('test_check'));"
再检查 runtime/cache/ 或 Redis 中是否写入成功,即可反推实际生效的 store。
为什么有人误以为 default 是“自动选择”
因为复合缓存支持多 store 协同(比如主从、读写分离),但 TP5 原生的 complex 类型**并不提供自动路由或故障转移逻辑**。它只是允许你用 Cache::store('xxx') 显式切换,而 default 只是规定了不加 store() 时的“默认通道”。真正的复合策略(如先查 Redis 失败再查 File)需自行封装,框架不内置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











