thinkphp 5 缓存有效期必须设为整数秒,单位是秒,非时间戳、字符串或浮点数;全局配置在 config/app.php 或 config/cache.php 的驱动项中,运行时通过 cache::set 第三个参数传入,请求缓存则由 config/app.php 中 request_cache_expire 控制。

ThinkPHP 5 的缓存有效期(expire)必须设为**整数秒**,单位是秒,不是时间戳、字符串或浮点数。设错会导致缓存不生效、立即失效,或被静默降级为默认值(通常是 3600 秒)。
全局配置中的 expire 设置
在 config/app.php 或 config/cache.php(依项目结构而定)中,expire 出现在缓存驱动配置里,例如:
- 文件缓存:
'type' => 'File', 'expire' => 3600 - Redis 缓存:
'type' => 'redis', 'expire' => 7200 - 复合缓存下各 store 分别配置,如
'file' => ['type'=>'File', 'expire'=>0]
注意:0 表示永久缓存(Redis 驱动下确实永不过期;Memcached 下可能被解释为 1 秒,需实测验证)。
运行时动态设置 expire(Cache::set)
调用 Cache::set($key, $value, $expire) 时,第三个参数必须是整数秒:
- 正确写法:
Cache::set('user_123', $data, 1800)(30 分钟) - 推荐计算方式:
time() + 3600,而非strtotime('+1 hour')(后者在时区异常时可能返回 false) - 避免传浮点数或字符串:
Cache::set('x', 'v', '3600')或Cache::set('x', 'v', 3600.5)会被忽略或转为默认值 - 安全写法:
(int) round($rawExpire)+ 正整数校验:is_numeric($raw) && $raw > 0 && floor($raw) == $raw
请求缓存的 expire 是另一套配置
请求缓存(URL 级缓存)不走 Cache 类,而是通过以下两个配置共同控制:
-
request_cache => true(布尔值,不能是字符串或数字) -
request_cache_expire => 3600(必须是整数秒)
这两项都在 config/app.php 的主配置数组中,不是 cache 子数组下。只对 GET 请求生效,缓存键是 URL 的 MD5 值。
不同驱动对 expire 的兼容差异
同一数值在不同驱动下行为可能不同:
- File 驱动:支持任意整数,包括超大值(如 31536000)
- Redis 驱动:最大支持约 136 年(2³²−1 秒),超大会被截断,可能导致意外提前过期
- Memcached 驱动:0 可能被识别为 1 秒,非 0 值较稳定
- Swoole Table 驱动:不支持动态 expire,只认固定 TTL 配置
上线前建议统一用 Redis 并加保护逻辑:$expire = min(2592000, (int)$expire)(限制最长 30 天)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











