yii2片段缓存通过duration设置固定过期时间(如3600秒),依赖dependency实现动态失效(file/db/expression),variations支持多版本缓存,enable可手动开关缓存。

Yii2 的片段缓存(Fragment Caching)用于缓存视图中某一块 HTML 内容,过期控制是核心配置项之一,直接决定缓存何时失效、是否需要重新生成。
duration 参数:设置固定存活时间
最常用也最直接的方式是通过 duration 选项指定缓存秒数。它表示从写入缓存那一刻起,内容最多保留多久。
- 值为 0 表示永不过期(不推荐生产环境使用)
- 值为 3600 表示缓存 1 小时,超时后下次请求会重新执行被包裹的代码并更新缓存
- 注意:duration 是“写入后计时”,不是“每次读取后重置”——不支持滑动过期(sliding expiration)
依赖机制(Dependency):按条件动态失效
仅靠 duration 不够灵活,比如数据源已更新但缓存还没到期。这时应配合依赖对象,让缓存自动感知变化。
- FileDependency:监控文件修改时间,适合配置类或模板文件变动触发刷新
-
DbDependency:监听 SQL 查询结果(如
SELECT MAX(updated_at) FROM article),数据表有更新就失效缓存 -
ExpressionDependency:运行一段 PHP 表达式,返回值变化即失效(例如
'expression' => 'time() > 1730613600')
变体(Variations)与缓存键分离
同一段 HTML 在不同用户、语言或设备下可能需要不同版本。用 variations 可以让缓存键自动带上区分维度,避免混用。
- 例如:
'variations' => [\Yii::$app->language, \Yii::$app->request->isMobile] - 每个组合生成独立缓存项,各自拥有独立的 duration 和 dependency
- 不设 variations 时,默认所有请求共享同一个缓存项,容易导致内容错乱
手动控制开关与强制跳过
开发调试或特殊场景下,可通过配置临时禁用缓存,而不改动业务逻辑。
-
enable 设为
false,则beginCache/endCache完全不生效,始终执行原始代码 - 结合
YII_DEBUG或请求参数做条件判断,例如:'enable' => !YII_DEBUG && \Yii::$app->request->isGet - 注意:enable=false 时,dependency 和 duration 都不再起作用











