ThinkPHP生产环境缓存驱动配置易忽略的要点是:.env中CACHE_DRIVER必须小写redis且未注释;config/cache.php中default与stores.redis配置需完整,host建议用localhost、timeout和read_timeout必须设为3、password为空也要显式写''、select必须为整数0、prefix和serialize=json不可缺;还需启用phpredis扩展、安装topthink/think-redis包,并清空runtime/cache/目录。

ThinkPHP生产环境缓存驱动配置容易忽略哪些点——不是配不配得上Redis,而是配对了却在高并发下连接超时、键名冲突、静默退化到file驱动,甚至缓存写进去了却读不到,问题全藏在细节里。
缓存驱动没切过去,还在用file
第一步:检查.env文件中CACHE_DRIVER=redis是否真实存在且未被注释;【CACHE_DRIVER必须小写redis,不能是Redis或REDIS】
第二步:确认config/cache.php里的'default' => 'redis'与.env一致;若两者冲突,.env优先级更高,但很多人只改cache.php却忘了改.env,结果重启后仍走file。
第三步:执行php -r "var_dump(cache('test', 'ok', 10));"再php -r "var_dump(cache('test'));",两次输出都应为字符串"ok";若第二次返回null,说明根本没连上Redis,正在fallback到file驱动。
立即学习“PHP免费学习笔记(深入)”;
Redis连接参数踩坑最密集
方法一:host别写127.0.0.1,改用localhost(避免IPv6解析延迟),或Docker环境下明确填宿主机IP(如host.docker.internal)。
方法二:timeout和read_timeout必须显式设为3,否则默认-1(阻塞等待),高并发时大量请求卡死在连接阶段。
方法三:password为空也必须写'',不能省略;空字符串会被当成无密码处理,而实际开了密码的Redis会拒绝连接,报NOAUTH Authentication required但框架不抛异常,只静默失败。
【select必须是整数0,不能写成字符串"0"——TP6会静默忽略该配置,导致连接成功但数据写到错误DB】
键名与序列化陷阱
File驱动下,key含空格、斜杠、中文会导致非法文件名,写入失败却无任何报错;Redis虽能存,但后续用redis-cli keys "*"查不到,因为ThinkPHP默认加think:前缀。
多项目共用一个Redis实例时,不设prefix必然键名冲突;建议统一设为'prefix' => 'prod_v2_',而不是留空或依赖默认值。
序列化方式别用默认serialize(),PHP 8.1+对闭包、资源句柄等类型更严格,容易存失败;【务必在stores.redis中加'serialize' => 'json'】,轻量、跨语言、兼容性好。
扩展与驱动注册漏掉关键一环
① 执行php -m | grep redis,输出必须含redis;若无,说明phpredis扩展未启用,装topthink/think-redis包也没用。
② 必须运行composer require topthink/think-redis;只装PHP扩展不装这个包,调用Cache::store('redis')会直接报Driver [redis] not supported。
③ 修改配置后,清空runtime/cache/目录;旧缓存配置可能被自动加载缓存住,导致新配置不生效。



















