cache::pull()是thinkphp5中取完即删的原子操作,用于验证码等一次性场景;返回当前值并同步删除键,键不存在时返回null;不支持标签缓存,且依赖正确配置的缓存驱动。

Cache::pull() 是 ThinkPHP 5 中一个“取完即删”的原子操作,适合需要一次性读取并确保后续不再复用的场景,比如验证码、一次性 Token、临时任务状态等。
基本用法和返回逻辑
调用 Cache::pull('key') 会立即返回当前缓存值,并**同步删除该键**。如果键不存在,直接返回 null(不会报错,也不触发默认值)。
-
Cache::pull('verify_code_123');→ 返回字符串如"a7f9",之后再get('verify_code_123')就是null -
Cache::pull('missing_key');→ 直接返回null,无副作用 - 不支持设置过期时间 —— 它只作用于已存在的、未过期的缓存项
和 get + rm 的区别
手动先 get 再 rm 存在竞态风险(尤其在并发请求下),而 pull 是底层驱动保障的单次操作:
- File 驱动:读文件 → 删除文件,两步原子化封装
- Redis 驱动:使用
GET+DEL命令组合(部分版本用 Lua 脚本保证原子性) - 避免了“读到值但删失败”或“删了但没读到”的中间态问题
配合标签使用的限制
pull() 不支持标签(tag)模式。带标签写入的缓存(如 Cache::tag('sms')->set('code_1001', '8899', 300))不能用 pull('code_1001') 安全获取并清除。
- 原因:标签缓存实际存储结构更复杂(需维护索引映射),
pull只处理直连键名 - 替代方案:先
get,再用Cache::tag('sms')->rm('code_1001')或整体clear('sms')
常见误用提醒
以下写法容易出问题:
-
cache('token_abc', null);→ 这是“设为 null”,不是删除;应改用Cache::pull('token_abc')或Cache::rm('token_abc') -
Cache::pull('counter');→ 若该键是inc()生成的数值型缓存,pull 后值消失,无法继续自增 - 在未正确配置缓存驱动时调用:会静默失败并返回
null,务必确认config/cache.php已存在且有效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











