cache::set第三个参数必须为正整数(单位:秒),表示相对过期时间;禁传时间戳、浮点数、字符串或datetime对象,需强制类型转换并校验范围,不同驱动对0值处理存在差异。

ThinkPHP 5 中通过 Cache::set() 设置缓存有效期,关键在于**第三个参数必须是正整数(单位:秒)**,表示从写入时刻起的相对过期时间。传错类型或数值会导致静默失败、立即失效或永久缓存。
Cache::set 第三个参数的正确用法
标准调用格式为:Cache::set($key, $value, $expire),其中 $expire 是核心:
- 传 正整数(如
3600):表示 1 小时后自动过期,这是最推荐、最稳定的方式 - 传 0:多数驱动(如 Redis)解释为“永不过期”;但 Memcached 可能当作 1 秒,需实测验证
- 避免传时间戳(如
1717023600)或DateTime对象——5.1+ 默认think\Cache不支持绝对时间,部分驱动会误判为负数导致立刻失效 - 禁止传浮点数(如
3600.5)、字符串(如'3600')或小数计算结果(如config('expire') * 1.5),PHP 隐式转换易出错
动态计算过期时间的安全写法
需要根据业务逻辑调整有效期时(比如用户等级越高缓存越久),务必做类型和范围校验:
- 用
(int)round($raw)强制转整型,不依赖自动转换 - 校验是否为合法正整数:
is_numeric($raw) && $raw > 0 && floor($raw) == $raw - 限制最大值防溢出(尤其 Redis 驱动上限约 136 年):
$expire = min(2592000, (int)$expire)(即封顶 30 天) - 基于当前时间推算,统一用
time() + 秒数,不用strtotime('+2 hours')(时区异常时可能返回 false)
不同驱动对 expire 的实际表现
同一段代码在不同缓存后端行为可能不同,上线前必须验证:
-
Redis:支持
0(永不过期),接受大整数(≤ 2³²−1),超大会被截断 -
Memcached:
0有歧义(部分版本视为 1 秒),建议避开,用较大正整数代替 - File 驱动:兼容性最好,任意正整数都可写入文件头,适合开发环境调试
-
Swoole Table:不支持动态过期,只认配置里的固定
expire,Cache::set的第三个参数会被忽略
调试与验证建议
避免“以为设了,其实没生效”:
- 开启缓存调试日志:
'cache' => ['debug' => true],查看实际写入的 TTL 值 - 用命令行直连后端验证:Redis 执行
TTL key,Memcached 用stats items查看 - 本地用 File 测试正常 ≠ 线上 Redis 正常,部署前务必在同环境验证
- 敏感数据(如用户登录态)禁用长缓存,宁短勿长
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











