cache::get()返回null主因是文件缓存未写入,需检查'default'=>'file'显式声明、path为可写绝对路径、prefix非空;同时确认runtime/cache/权限及键名仅含字母数字下划线。

Cache::get() 返回 null?大概率不是代码写错了,而是文件缓存根本没写进去,或者路径、权限、键名不合法——它不会报错,只会静默失败。
cache.php 配置里必须填对这三项
ThinkPHP 6.1 的文件缓存驱动不依赖扩展,但配置项漏一项就会 fallback 到空逻辑:
-
'default' => 'file'必须显式声明,否则即使'stores'['file']写全了也用不上 -
'path'必须是 PHP 进程有写权限的**绝对路径**;常见错误是填相对路径如'cache/',实际应为app()->getRuntimePath() . 'cache/' -
'prefix'建议设非空(如'tp6_'),避免多个项目共用同一runtime/cache/目录时键名冲突
runtime/cache/ 目录权限和键名合法性最常被忽略
文件缓存写入失败几乎从不抛异常,只默默跳过:
- 确认
runtime/cache/目录存在且 PHP 用户(如www-data或_www)有写权限;Docker 环境尤其注意挂载卷权限 - 缓存键名含空格、斜杠、中文或控制字符(如
'user:123/role')会导致生成非法文件名,写入失败;改用md5($key)或只保留字母数字下划线 - 别混用旧版 TP5 的
S('key', $val),TP6+ 已废弃,只认Cache::set()
为什么 Cache::remember() 在 file 驱动下总失效
本质是 key 生成不稳定 + 序列化后文件体积膨胀导致读取失败:
- 闭包里用了未声明变量(如直接写
$this->id而非use ($id)),每次调用生成的 key 不同,缓存写进去了也读不到 - 对象缓存建议先转数组:
Cache::remember('user_'.$id, 3600, function () use ($id) { return User::find($id)->toArray(); }),避免序列化 Model 实例带来的冗余和兼容问题 - file 驱动不支持原子过期清理,大量缓存堆积后
runtime/cache/目录变慢;定期清空或用Cache::clear()主动触发
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











