ThinkPHP 8.1 缓存文件堆积主因是 File 驱动不主动清理过期文件,仅读取时校验;应区分 runtime/cache/、temp/、schema/、log/ 等目录用途,优先使用 php think clear 系列命令精准清理,生产环境推荐按时间自定义清理旧文件。

ThinkPHP 8.1 的缓存文件堆积,本质是 File 驱动不主动清理过期文件——哪怕配置了 expire,也只在读取时判断是否过期,磁盘上的旧文件照留不误。快速删除不能靠“暴力全删”,得兼顾安全、精准和可持续性。
区分要清什么:别一锅端 runtime/
TP8.1 的缓存分散在多个位置,不同用途不能混着删:
-
runtime/cache/:File 驱动的数据缓存(如
Cache::set()写入的 PHP 文件) - runtime/temp/:模板编译缓存(.php 文件)、配置编译缓存
- runtime/schema/:模型字段结构缓存(DB 字段映射,需显式清除)
- runtime/log/:日志文件(与缓存无关,但常被误删;建议单独管理)
-
Redis/Memcached:若配置了非 file 驱动,
runtime/cache/里可能为空,实际缓存不在本地磁盘
命令行快速清理(开发/部署常用)
优先用框架内置命令,避免手动删错目录:
-
php think clear:清空temp、cache、log、route等全部 runtime 子目录(适合调试重置) -
php think clear --temp:只清模板编译缓存(改了模板后必用) -
php think clear --cache:只清runtime/cache/下的文件缓存 -
php think clear --all:清驱动级缓存(含 Redis 中带 prefix 的 key),但不包括模型查询缓存、标签缓存、schema 缓存
按时间精准清理旧文件(生产环境推荐)
全量清空会影响线上性能,建议自定义命令,只删「N 天前」的缓存文件:
立即学习“PHP免费学习笔记(深入)”;
- 新建命令类
app/command/ClearOldCache.php - 核心逻辑用
filemtime()判断修改时间,不是按文件名猜日期 - 示例:清理
runtime/cache/下 24 小时未更新的 .php 文件 - 加
clearstatcache()避免 Linux 下 opcache 缓存 stat 结果导致误判 - 配合 Linux cron 定时执行,比如每天凌晨 2 点:
0 2 * * * cd /path/to/project && php think clear-old-cache >> /var/log/tp-clear.log 2>&1
绕过缓存验证问题(比删除更安全)
遇到“删了还是旧数据”,先别急着再删,可能是缓存没真正生效或类型不对:
- 临时切换缓存驱动为
null:在config/cache.php中设'default' => 'null',重启服务看是否恢复正常 - 检查是否用了多级缓存:比如模型查库 + 手动
cache(true),这种缓存不走Cache::clear(),得用Db::clearCache() - Redis 场景下,用
redis-cli -a yourpass keys "think_*" | xargs redis-cli -a yourpass del手动确认真实 key 是否清除 - 浏览器禁用缓存或用无痕模式测试,排除前端或代理缓存干扰



















