缓存驱动配置应优先修改 .env 文件中的 cache_driver,如 cache_driver=redis;redis 需设置 timeout 和 read_timeout 为 3,memcached 要启用二进制协议;键名避免特殊字符,序列化建议改用 json。

缓存驱动配置文件在哪改?
ThinkPHP 的缓存驱动不是在 config/cache.php 里硬编码切换的,而是在环境配置中通过 cache.driver 控制。默认情况下,.env 文件优先级更高,所以改这里最直接:
常见错误是只改了 config/cache.php 却没动 .env,结果重启后还是走 file 驱动。
-
CACHE_DRIVER=redis或CACHE_DRIVER=memcached必须写在.env里 - 如果用了多级缓存(如 redis + file 回退),得在
config/cache.php中显式定义stores数组,并确保default指向你配的 store 名 - 修改后必须清空 runtime/cache/ 目录,否则旧缓存配置可能被自动加载缓存住
Redis 连接参数怎么填才不超时?
ThinkPHP 默认用 Predis 客户端,但很多线上问题出在连接池和超时设置缺失:
现象:高并发下大量 Connection refused 或 read error on connection
-
redis.host别写127.0.0.1,改用localhost(避免 IPv6 解析延迟)或明确指定host: 127.0.0.1+port: 6379 - 必须加
redis.timeout=3和redis.read_timeout=3,否则默认 -1(阻塞等待),容易卡死整个请求 - 如果 Redis 开了密码,
redis.password要非空字符串,空字符串会被当成无密码处理,导致 AUTH 失败 - 集群模式不支持原生
Predis,得换phpredis扩展并手动配置redis.scheme=redis和redis.nodes
Memcached 性能为什么比 Redis 还慢? 这不是 Memcached 本身的问题,而是 ThinkPHP 对它的默认封装方式导致的:
现象:启用 memcached 后响应时间反而上升,getMultiple 批量读几乎没效果
- ThinkPHP 默认用
Memcached类,但没开启OPT_BINARY_PROTOCOL,文本协议开销大,务必在config/cache.php的 memcached 配置里加:'options' => [\Memcached::OPT_BINARY_PROTOCOL => true] - 别用
memcached.hosts数组去配多个节点——ThinkPHP 不支持自动分片,只会轮询连接,实际只用第一个;要真做分布式,得自己实现Memcached实例管理 - Memcached 不支持 TTL 为 0(永久),设成 0 会变成 30 天,想长期缓存请用大于 30 天的秒数,比如
2592000(30 天)
缓存键名冲突和序列化陷阱
ThinkPHP 自动给 key 加前缀(think:),但开发者常忽略底层序列化行为:
现象:Redis 里看到一堆乱码 key,或者 get 返回 null,但 getRaw 能取到数据
- 默认用
serialize()序列化,PHP 8.1+ 对对象序列化更严格,含闭包或资源句柄的数据会失败;建议统一改成json编码,在cache.php中设'serialize' => 'json' - 自定义 key 时别用点号(
.)或冒号(:)开头,ThinkPHP 内部用这些做命名空间分隔,可能导致clear清不干净 - Redis 的
KEYS think:*在生产环境禁用,查 key 请用SCAN,ThinkPHP 的clear()方法底层已适配 SCAN,但前提是没手动改过prefix
缓存驱动不是配完就完的事,Redis 和 Memcached 的行为差异会穿透到业务逻辑里,比如原子操作、过期策略、空值缓存处理,这些地方一旦没对齐,问题往往出现在压测后期。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











