cache::get()返回null多数因缓存未写入或读取位置错误,需排查配置、驱动、路径、权限四环节:验证cache::set是否生效;禁用废弃s()函数;确认store名称与config/cache.php中stores配置严格匹配;redis须满足php扩展、think-redis包、小写type、完整连接参数、关闭prefix;检查runtime/cache或%appdata%\roaming\composer\cache目录权限;用php think命令行和redis-cli直连验证。

Cache::get() 返回 null,多数情况不是代码写错了,而是缓存压根没写进去、或写进去了但根本没读到正确位置。问题常藏在配置、驱动、路径、权限这四个环节里,逐项排查比反复改业务逻辑更有效。
检查缓存是否真的写进去了
别直接怀疑 get,先验证 set 是否生效:
- 在控制器中执行:Cache::set('test_key', 'hello', 60); dump(Cache::get('test_key')); —— 若仍返回 null,说明写入失败或驱动未就绪
- 确认没混用已废弃的 S() 函数(TP6+ 中 S() 不再绑定 Cache 驱动)
- 若用了 Cache::store('redis'),要确保 config/cache.php 的 stores 数组里真有名为 'redis' 的完整配置项,名字拼错会静默回落到 file 驱动
确认缓存驱动配置是否完整且生效
尤其 Redis 场景下,以下五项缺一不可:
- PHP 已启用 redis 扩展(php -m | grep redis,非 phpredis 或 igbinary)
- 已通过 Composer 安装 topthink/think-redis
- config/cache.php 中 default => 'redis',且 stores.redis.type 是小写 'redis'(大写 'Redis' 会报 Driver not supported)
- stores.redis.host / port / select / password 全部显式声明(password 为空也要写 '',不能省略)
- 临时关闭 prefix(设为 ''),避免调试时 key 被隐藏或哈希化
验证运行环境与目录权限
File 驱动和 Redis 都可能因权限卡住:
- runtime/cache/ 目录必须存在,且 PHP 进程用户(如 www-data、IIS_IUSRS、或你的登录账户)有读写执行权限
- Windows 下特别注意:%APPDATA%\Roaming\Composer\Cache 若无写权限,会导致 autoload 加载异常,连带 Cache 初始化失败;可用 composer clear-cache 测试是否报 “Access is denied”
- 若改过 cache.path 配置,务必使用绝对路径(如 __DIR__ . '/../data/cache/'),相对路径容易因 CLI/Web 运行上下文不同而失效
用命令行和日志交叉验证
绕过 Web 请求,直击底层行为:
- 终端执行:php think cache:clear 和 php think cache:set test_cli hello 60,再 php think cache:get test_cli —— 成功则说明框架层 OK,问题出在请求上下文
- 开启缓存日志:config/cache.php 中设置 'logger' => 'cache',并在 config/log.php 配置 cache 日志通道,查看 runtime/log/cache/ 下是否有连接失败、key 未命中等记录
- Redis 用户可直连 redis-cli,执行 KEYS * 或 GET think:test_key(注意前缀),确认数据是否真实存在于服务端
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











