ThinkPHP 6 切换缓存驱动需修改 config/cache.php 中 'default' 值并执行 php think clear:config 清配置缓存;常驻进程需重启;推荐用 env() + .env 多环境管理,注意 stores 中各驱动的 prefix、expire、serialize 配置一致性。

直接改 default 值就能切驱动,但得清配置缓存
ThinkPHP 6 的缓存驱动切换,核心就一条:改 config/cache.php 里 'default' 的值。比如从 'file' 改成 'redis',框架后续所有未显式指定 store 的 Cache::get()、Cache::set() 都会走 Redis。
但改完不生效?常见原因是配置被缓存了。必须执行:php think clear:config
- 这个命令只清 config 缓存,不影响 runtime 下的 cache/ 或 log/ 目录
- 如果用的是 Swoole 或 RoadRunner 等常驻进程,改完还得重启服务,否则旧配置仍驻留在内存中
-
env('cache.driver', 'file')这种写法,记得检查 .env 文件里是否定义了CACHE_DRIVER=redis,它会覆盖配置文件里的默认值
Cache::store('xxx') 是运行时动态切换,不依赖配置文件
想临时用 Redis 存用户数据、同时用 File 存模板片段?不用动 cache.php,直接在代码里调用 Cache::store():
Cache::store('redis')->set('user_1001', $data, 3600);
Cache::store('file')->get('template_header');
注意点:
立即学习“PHP免费学习笔记(深入)”;
-
'redis'和'file'必须已在stores数组里正确定义,否则抛出InvalidArgumentException - 每个 store 实例的
expire是独立的——stores['redis']['expire']不影响stores['file']['expire'] - 调用
Cache::store('redis')后再链式调用set(),不会改变全局default行为,只作用于本次链式调用
切换时最容易忽略的序列化兼容问题
File 驱动默认用 serialize/unserialize,Redis 驱动默认也启用序列化('serialize' => true),但如果你手动关了 Redis 的序列化,而缓存值是数组或对象,Cache::get() 会返回字符串而非原始结构。
验证方式:
- 存一个数组:
Cache::set('test', ['a' => 1], 3600) - 取出来后用
is_array()判断,不是数组就说明反序列化失败 - 检查对应 store 的
'serialize'配置项:TP6 默认是true,但某些自定义驱动或低版本可能默认关掉 - Redis 密码错误或连接超时不会报序列化错,而是静默返回
false,容易误判为“没存进去”
多环境切换别硬编码,用 env() + .env 分离
开发用 file,测试和生产必须用 redis——别在 cache.php 里写死 'default' => 'redis',改用环境变量驱动:
'default' => env('CACHE_DRIVER', 'file'),
'stores' => [
'file' => [...],
'redis' => [
'type' => 'redis',
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', ''),
'expire' => (int) env('REDIS_CACHE_EXPIRE', 3600),
],
],
这样只需在不同环境的 .env 里写:
- 开发:
CACHE_DRIVER=file - 生产:
CACHE_DRIVER=redis+REDIS_HOST=prod-redis.internal - 改完
.env不用清配置缓存,但要确保env()加载顺序正确(TP6 默认支持)
真正麻烦的不是切换动作本身,而是切换后各 store 的 prefix、expire、serialize 是否保持语义一致——比如 file 驱动设了 'prefix' => 'dev_',redis 却没设,key 就对不上,查不到数据还找不到原因。



















