修改缓存驱动配置中的 expire 参数是唯一有效方式,需在 config/cache.php(TP6)或 application/config.php 的 cache 节点中调整 default.type 对应的 expire 值(单位秒),修改后须执行 php think clear:config 清理配置缓存。

缓存驱动配置里改 expire 参数最直接
ThinkPHP 的全局缓存生命周期,本质是缓存驱动初始化时传入的默认过期时间,不是运行时统一开关。改它,得进配置文件,不是调某个函数就能“全局覆盖”。
常见错误是以为在控制器里写 Cache::set('key', $val, 3600) 就能改变所有缓存行为——其实这只是单次写入指定过期时间,对其他没影响。
- 配置路径通常是
config/cache.php(TP6)或application/config.php里的'cache'节点(TP5) - 关键字段是
'default' => ['type' => 'file', 'expire' => 3600]中的expire,单位为秒 - 不同驱动支持程度不同:比如
redis驱动会把expire直接转成SETEX命令,而memcached对超大数值可能截断(如 >30 天按 Unix 时间戳处理) - TP6 中若启用多缓存通道(
store),每个 store 可独立设expire,不共享全局值
用 Cache::remember() 时过期时间不能省略
这个方法常被误认为“自动走全局 expire”,其实它必须显式传第 3 个参数,否则默认是 0(永不过期)或由底层驱动兜底,和配置里的 expire 无关。
典型场景:查数据库后缓存结果,想复用配置里的 3600 秒,但代码写成 Cache::remember('user_123', function() { return User::find(123); }) —— 这样缓存不会自动失效。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法是
Cache::remember('user_123', 3600, function() { return User::find(123); }) - 如果硬要复用配置值,得手动读:
config('cache.default.expire'),但注意 TP5/TP6 路径不同,且配置未加载时会报错 - TP6.3+ 支持在
remember()里传null表示使用驱动默认 expire,但前提是驱动初始化时确实传了该值(即配置里写了expire)
运行时调 Cache::set() 不影响全局配置
很多人想“临时延长所有缓存”,于是循环调 Cache::set() 并加大过期时间——这只能重写已有 key,对后续新写入的缓存完全无效。
更隐蔽的坑是:有些自定义缓存封装(比如封装了 Cache::tag())内部没透传 $ttl,导致你以为设了 7200,实际还是按配置的 3600 存。
-
Cache::set('k', 'v')等价于Cache::set('k', 'v', null),此时用的是驱动初始化时的默认expire -
Cache::set('k', 'v', 0)在 file/redis 驱动中是“永不过期”,但 memcached 里 0 表示“用服务器默认”,行为不一致 - TP5.1 的
think\Cache类里,$this->handler->set()如果 handler 没实现set的第三个参数,就会忽略你传的 ttl
Redis 缓存要注意 expire 和 timeout 不是一回事
当缓存驱动设为 redis,配置里同时有 expire(缓存键过期)和 timeout(连接超时),新手容易混淆。改错地方会导致“明明设了 3600,缓存几秒就没了”。
真实案例:redis 服务端设置了 maxmemory-policy volatile-lru,又没配 expire,结果内存满时随机删 key,看起来像“提前过期”。
-
expire控制每个 key 的 TTL,写入时由 ThinkPHP 传给 Redis 的SETEX或SET+EX -
timeout是连接池参数,单位秒,超时会抛ConnectTimeoutException,和缓存内容生命周期无关 - Redis 本身有
CONFIG SET maxmemory限制,若业务缓存总量接近该值,即使expire没到,也会被 LRU 清掉 - TP6 默认用 phpredis 扩展,若扩展版本 30 天)可能出错,建议保持
expire≤ 2592000(30 天)
真正要改全局缓存寿命,只有一条路:找到 cache 配置里那个 expire 字段,改完清配置缓存(php think clear:config)。其他任何运行时操作,都是局部、临时、不可靠的。


















