apcu_delete()是删除指定键的唯一可靠方式,仅支持精确匹配字符串或数组,不支持通配符;需注意大小写敏感、TTL过期影响及CLI模式下apc.enable_cli配置问题。

apcu_delete() 是清指定键的唯一可靠方式
APCu 没有类似 Redis 的 DEL key 那样带通配符或模糊匹配的批量删除接口,清单个键必须用 apcu_delete()。它接受字符串键名或字符串数组,返回布尔值——成功删掉至少一个键就返回 true,否则 false(包括键不存在、参数类型错误等情况)。
常见误操作是试图传入正则或 glob 模式,比如 apcu_delete('user_*'),这只会去删一个叫 user_* 的字面量键,不会匹配任何实际数据。
- 确保键名完全一致:APCu 键区分大小写,且不自动处理命名空间前缀(除非你自己加了)
- 如果用
apcu_store()存时带了 TTL,键可能已过期消失,此时apcu_delete()仍返回false,需配合apcu_exists()判断 - 多键删除建议传数组而非循环调用:一次
apcu_delete(['key1', 'key2', 'key3'])比三次单独调用略高效,且原子性更好
键名不确定时,先用 apcu_fetch() 或 apcu_exists() 校验
直接删一个不存在的键不会报错,但返回 false 容易被忽略,导致你以为删了其实没生效。尤其在缓存穿透或并发场景下,键可能刚被其他进程删掉或未写入。
推荐流程是:删之前先确认键存在,或删完后检查是否真没了。
立即学习“PHP免费学习笔记(深入)”;
if (apcu_exists('user:123')) { apcu_delete('user:123'); }- 或者更稳妥:
$old = apcu_fetch('user:123'); if ($old !== false) { apcu_delete('user:123'); } - 注意:
apcu_fetch()在键存在但值为false时也返回false,所以不能单靠返回值判断“是否存在”,必须用apcu_exists()
无法清“某类键”?得靠应用层自己维护索引
APCu 原生不支持按前缀、标签或模式批量清理,比如想删所有 user: 开头的键,必须自己记录这些键名。常见做法是在存储时同步写入一个索引数组:
apcu_store('user:123', $data);
apcu_store('user:index', array_merge(apcu_fetch('user:index') ?: [], ['user:123']));
后续清空时读出索引再批量删:
$keys = apcu_fetch('user:index') ?: [];
if (!empty($keys)) {
apcu_delete($keys);
apcu_delete('user:index');
}
- 这个索引本身也要设 TTL,避免无限膨胀
- 并发写入时,
apcu_fetch+apcu_store不是原子操作,可能丢键;高并发下建议改用apcu_inc()或外部协调(如文件锁) - 别依赖
apcu_cache_info()['cache_list']遍历过滤——它只返回当前进程可见的键(受apc.enable_cli和 SAPI 影响),且性能差、不可靠
CLI 模式下 apcu_delete() 可能无效?检查 apc.enable_cli 配置
PHP CLI 默认禁用 APCu 用户缓存(apc.enable_cli=0),此时 apcu_store() 和 apcu_delete() 都静默失败,不报错也不生效。Web 请求(如 Apache/FPM)不受影响,但命令行脚本会踩坑。
- 运行
php -i | grep apc.enable_cli确认值为On - 临时启用可在脚本开头加:
ini_set('apc.enable_cli', '1');(需在apcu_*()调用前) - 注意:CLI 下 APCu 缓存是进程级的,不同 CLI 进程间不共享,所以“从 Web 界面删,CLI 脚本还读得到”是正常现象











