ThinkPHP 8.0 缓存文件仅在使用 file 驱动时才真实写入 runtime/cache/ 目录,redis/memcached 驱动数据存于远程服务中,null 驱动则无任何文件;空目录常见原因为 runtime 不可写、APP_DEBUG=true 或未调用 Cache::set()。

ThinkPHP 8.0 的缓存文件默认存在 runtime/cache/ 目录下,但能否看到、是否真实写入,取决于配置、环境和驱动类型——不是所有缓存都落盘到这个目录。
先确认你用的是哪种缓存驱动
缓存文件位置由 config/cache.php 中的 'default' 驱动决定:
-
file 驱动:缓存会生成 PHP 文件,路径为
runtime/cache/xxx.php(如runtime/cache/user_1001.php),这是唯一真正“有缓存文件”的场景。 -
redis / memcached 驱动:缓存数据存在内存或远程服务中,
runtime/cache/目录下不会生成任何文件。你找不到文件,是因为它根本不在本地磁盘上。 - null 驱动:完全不缓存,自然也没有文件。
为什么 runtime/cache 目录是空的?常见原因
即使你配置了 file 驱动,runtime/cache/ 仍可能为空,重点排查以下几点:
-
runtime/目录不可写:Web 进程用户(如 www-data)没有写权限,缓存写入失败且静默忽略;执行ls -ld runtime/和ls -ld runtime/cache/查权限,建议设为755或775。 -
APP_DEBUG = true:调试模式下框架跳过所有缓存写入逻辑(包括 file 驱动),runtime/cache/永远为空;检查config/app.php或.env是否最终解析为true。 - 缓存键未触发写入:比如只调用了
Cache::get()但没调Cache::set(),或设置了0秒有效期,缓存立即过期不落地。 - 自定义 store 实例:如
Cache::store('my_file'),它的缓存路径由该 store 的'path'配置决定,与默认 file 驱动无关。
找不到缓存文件时,怎么验证缓存是否真在工作?
别只盯着目录,用更可靠的方式确认:
立即学习“PHP免费学习笔记(深入)”;
- 对 Redis:进 Redis CLI 执行
keys think_*(注意前缀是否匹配 config 中设置的prefix);或用get think_user_1001直接查值。 - 对 file 驱动:临时加一行代码
Cache::set('test_debug', 'ok', 60);,然后立刻用var_dump(file_exists(runtime_path() . 'cache/test_debug.php'));判断是否生成。 - 看响应时间:开启日志后,重复请求同一缓存接口,若第二次明显更快(如从 80ms 降到 5ms),说明缓存已生效,哪怕你没找到文件。
想强制让缓存落到 runtime/cache 下?只有一条路
确保三点同时满足:
-
config/cache.php中'default' => 'file'; -
stores['file']['path']明确指向runtime_path() . 'cache/'(不要被.env中的CACHE_PATH覆盖); -
APP_DEBUG = false且runtime/cache/可写。
满足后,每次 Cache::set() 都会生成对应 PHP 文件,可用 ls runtime/cache/ 查看。



















