tp6缓存驱动切redis报错主因是驱动未注册、php扩展未启用、配置字段错误或runtime残留文件干扰;须先验证cache::getdrivername()返回redis,再清理runtime/cache/、route/、config/目录。

TP6缓存驱动切到Redis报错,多数不是Redis服务本身的问题,而是驱动没注册、扩展没启用、配置字段写错或路径残留干扰导致的“假失败”。重点不在连不连得上Redis,而在ThinkPHP有没有真正用上它。
先确认Redis驱动是否真正加载
别急着清缓存或改配置,先验证框架是否认得redis这个驱动:
- 执行php think version,确保是TP6.x(非5.1)
- 运行php think run,看启动日志里有没有Using cache store: redis
- 在控制器里加一行:dump(Cache::getDriverName());,返回redis才算成功;若返回file或报Cache handler not exists: redis,说明配置根本没生效,此时清理Redis毫无意义
常见报错原因与对应修复
Driver [redis] not supported:90%是以下三者缺一:
- 没装topthink/think-redis扩展——执行composer require topthink/think-redis
- PHP未启用redis扩展——运行php -m | grep redis,无输出就去php.ini加extension=redis.so(Linux)或extension=php_redis.dll(Windows),改完必须重启PHP-FPM和Web服务器
- config/cache.php里stores.redis配置不全或类型错误:type必须小写,select必须是整数(不能写"0"),password即使为空也得显式写''
TypeError: Argument #3 ($retry_interval) must be of type int, float given:升级phpredis扩展至≥5.3.7,并在redis配置中把retry_interval设为整数(如100)
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
Cache::get()返回null:先关掉prefix(临时设为''),再用redis-cli手动get键名验证——若CLI能查到但TP读不到,大概率是前缀不一致或序列化方式冲突
切换后必须清理的旧文件缓存
哪怕Redis已跑通,runtime下残留的文件缓存仍会优先被加载,引发路由404、配置不生效等“诡异问题”:
- 清空runtime/cache/、runtime/route/、runtime/config/三个目录(不要删整个runtime)
- 多应用模式下,要清runtime/*/cache/、runtime/*/route/、runtime/*/config/
- 生产环境建议只清含cache、route、config、data字样的子目录,跳过log/和swoole/
Redis连接与使用要点
配置写对只是第一步,实际使用还要注意:
- 连接参数不用redis://格式,必须拆成host、port、select
- 高并发场景务必启用连接池:把type从redis改为redis_pool,并配好max_active等参数
- Session和Cache若共用Redis,必须用不同prefix,否则FLUSHDB会误删session数据
- 用cache('key', $value, $ttl)比Cache::store('redis')->set()更简洁,且自动走默认store










