ThinkPHP 无内置自动清理缓存机制,需依赖外部定时任务或请求钩子触发;cache.php 中的 expire 仅控制单条缓存生命周期,不执行物理删除;file 驱动下过期文件残留,redis 依赖自身 EXPIRE 但不即时;真正自动清理须配置系统级定时任务(如 crontab),并注意路径、驱动差异与命令行为。

ThinkPHP 没有内置的“自动清理缓存”调度机制——所有所谓“自动”,都依赖你手动配置外部触发方式,比如定时任务或请求钩子。直接在 config/cache.php 里设个参数就想让缓存定期自删,行不通。
cache.php 里的 expire 只控制单条缓存生命周期,不触发清理动作
配置项 expire(单位秒)只决定每条缓存写入后最多活多久,比如设成 3600,那这条缓存一小时后 Cache::get() 就返回 null。但它不会主动从 Redis 或文件系统里物理删除过期数据。
这意味着:
- file 驱动下,过期文件会一直留在
runtime/cache/里,越积越多,直到被php think clear或手动删目录干掉 - redis 驱动下,Redis 自身的
EXPIRE机制会后台惰性/定期清理,但不保证即时——尤其高并发时可能堆积大量过期 key -
Cache::clear()或命令行php think clear:cache仍需你显式调用,不会因 expire 到期而自动执行
想真正“自动清理”,得靠外部定时任务(Linux crontab / Windows Task Scheduler)
最稳妥、生产环境通用的做法是把清理逻辑外包给系统级定时器,而不是指望框架自己跑调度。
立即学习“PHP免费学习笔记(深入)”;
例如,在 Linux 上每天凌晨 2 点清空 file 缓存:
0 2 * * * cd /path/to/your/project && php think clear:cache > /dev/null 2>&1
注意几点:
- 必须用绝对路径(
/path/to/your/project),不能用~或相对路径,crontab 不认 shell 别名和当前工作目录 - 如果项目用 redis 驱动,
php think clear:cache在 TP6+ 会连带清 Redis,但默认前缀是think_cache:,不会误删其他业务 key;若担心,加--except=redis - 别用
php think clear --all做定时任务——它会连带清runtime/log/和runtime/route/,可能导致路由缓存丢失引发首次访问延迟甚至 404
请求中被动触发清理:适合低频更新 + 强一致性场景
有些业务要求“数据一改,相关缓存立刻失效”,这时可在控制器或模型操作后主动调用清除逻辑,而非等 expire。
常见模式:
- 更新用户资料后,立即执行
Cache::tag('user')->clear(),确保所有打user标签的缓存(如个人页、订单列表)全部失效 - 发布新文章后,用
Cache::delete('article_list')或Cache::clear('article_list')清单页缓存 - 避免在高频接口(如首页浏览)里写
Cache::clear(),这会把缓存雪崩风险引入正常流量路径
注意:Cache::tag() 只对 file 和 redis 驱动有效,apc/xcache 不支持标签,用了等于白写。
TP6+ 的 cache:clear 命令行为和驱动强绑定,不看配置就跑命令等于盲操作
TP6 开始,php think clear:cache 不再只是删文件夹,它会根据 config/cache.php 中的 default 驱动类型,调用对应驱动的原生清理逻辑:
- file 驱动 → 扫描并删除
runtime/cache/下匹配前缀的文件 - redis 驱动 → 发送
SCAN+DEL命令,按前缀(如think_cache:*)安全批量删除,不碰FLUSHDB - memcached 驱动 → 调用
flush(),但该操作会清空整个 memcached 实例,慎用
所以每次上线或换缓存服务前,务必确认 config/cache.php 配置正确,否则 php think clear:cache 可能什么都没清,或者清错地方。



















