安全批量删除缓存需分类型处理:文件缓存用glob()匹配白名单后校验mtime;Redis用SCAN分批删带前缀的key;OPcache只能调opcache_reset()且需权限控制。

PHP里怎么安全批量删除缓存文件
直接遍历目录删 filemtime() 超期的缓存文件最常用,但必须加路径白名单和文件名校验,否则容易误删配置或日志。别信“一键清空缓存目录”的脚本,rm -rf 或 unlink() 递归没过滤等于自毁。
用 glob() 按规则匹配缓存文件再删
glob() 比 scandir() 更适合批量删缓存,能用通配符限定扩展名和命名模式,避免扫到非缓存文件。
- 只删
.cache和.json缓存:glob('/path/to/cache/*.cache')、glob('/path/to/cache/*.json') - 排除子目录干扰(默认不递归):
glob('/path/to/cache/*.{cache,json}', GLOB_BRACE) - 加时间判断再删:
if (time() - filemtime($f) > 3600) { unlink($f); }
Redis 缓存批量删 key 要避开 KEYS *
KEYS * 在生产 Redis 上禁用——它会阻塞主线程,大数据量时可能卡住整个服务。必须用 SCAN 游标分批处理。
- PHP 用
redis->scan()迭代:$it = NULL; while ($keys = $redis->scan($it, 'cache:*', 100)) { $redis->del($keys); } - 前缀要明确,比如统一用
cache:user:、cache:post:,删的时候才可控 - 注意
SCAN不保证一次返回全量,$it为 0 才算结束
OPcache 清理不能靠删文件,得调 opcache_reset()
OPcache 是内存级编译缓存,磁盘上没有对应“缓存文件”可删。opcache_reset() 是唯一有效方式,但它需要 PHP-FPM 进程权限且只对当前进程生效。
立即学习“PHP免费学习笔记(深入)”;
- CLI 下执行无效(除非 CLI 启用了 OPcache)
- Web 请求中调用需配合权限控制,比如加 token 验证:
if ($_GET['token'] === $_SERVER['OPCACHE_TOKEN']) { opcache_reset(); } - 批量重载不现实,只能整机刷新;若需局部更新,应改用
opcache_invalidate()指定单个文件
缓存类型不同,清理机制就完全不一样:文件缓存看路径和时间,Redis 看 key 前缀和游标,OPcache 只能重置内存状态——混用方法只会清不干净或引发故障。











