cache::get()返回null主因是缓存未写入或读取失败:检查runtime/cache目录权限、路径是否为绝对或正确相对路径、避免混用已废弃的s()函数,以及确认多store配置中store名是否正确定义。

单机开发或低流量后台,用 file 驱动完全够用;但只要部署多实例、有用户会话、商品列表这类高频读场景,必须切到 redis——不是“更优”,而是 file 在并发下会因文件锁排队,响应直接变卡顿。
为什么 Cache::get() 总是返回 null?先查这三处
这不是代码写错,大概率是缓存压根没写进去,或写进去了却读不到:
- 检查
runtime/cache/目录是否存在且 PHP 进程有写权限;若改过path,确认是**绝对路径**(如/var/www/tp6/runtime/cache)或相对于项目根目录的正确相对路径(如../data/cache/) - 确认没在控制器里混用 TP5 的
S('key', $val)—— TP6+ 已废弃,只认Cache::set() - TP6 支持多 store,如果你用了
Cache::store('redis')->get('key'),但配置里没定义'redis'store 或拼错名字,就会 fallback 到默认驱动(可能是file),导致跨 store 读不到 - 缓存键名含空格、斜杠、中文时,
file驱动会生成非法文件名,写入静默失败;简单兜底:用md5($key)或只含字母、数字、下划线的命名
config/cache.php 里哪些字段不能省?
ThinkPHP 6+ 的缓存配置集中在 config/cache.php,关键字段不是越多越好,而是按需填准:
-
'default'必须明确指定驱动名,比如'redis',否则即使'stores'['redis']写全了也用不上 -
'host'和'port'在redis驱动下必须可连通;本地测试常填'127.0.0.1',但 Docker 环境得换'host.docker.internal'或宿主机 IP -
'prefix'建议设非空值(如'tp6_'),避免多个项目共用 Redis 时键名冲突 -
'expire'设为 0 表示永不过期,但 Redis 内存有限,慎用;设为负数(如-1)在部分旧版 TP 中会被忽略,建议统一用正整数秒
TP8 的 Redis 配置最容易静默失效
TP8 不从 .env 解析 REDIS_HOST、REDIS_PORT 等字段,这些变量仅作开关用途(如 CACHE_STORE=redis),底层连接仍由 config/cache.php 硬编码控制:
-
'stores' => ['redis' => []]数组里,'host'、'port'、'database'、'password'(ACL 模式下用'auth')一个都不能缺,留空或注释掉就会 fallback - 若 Redis 启用 ACL(Redis ≥6.0),
password字段要换成auth,且确认用户有+@all权限,否则SET类命令会静默失败 - 验证是否真连上 Redis 的最快方式:
php think tinker后执行(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping(),返回+PONG才算通 - 连接失败不报错,但功能会悄悄降级:现象包括登录后刷新页面变未登录、
Cache::set()成功但get()返回null、接口响应时间忽高忽低
最易被忽略的是:TP8 的 cache 和 session 配置不共享,config/session.php 里也必须单独配全 store 数组,不能只写 'type' => 'redis';否则运行时抛出 Call to a member function setOptions() on null。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











