yii 2.0.45 中页面片段缓存需用 $this->begincache() 和 $this->endcache() 包裹视图内容,并配置 cache 组件(如 filecache 或 yii\redis\cache),依赖 duration、enabled 及可选 dependency 实现时效性与一致性,调试需清缓存并观察重建行为。

Yii 2.0.45 中实现页面片段缓存,核心是使用 $this->beginCache() 和 $this->endCache() 包裹视图中需要缓存的 HTML 片段,并确保缓存组件已正确配置。它不依赖控制器行为,而是直接在视图层控制,适合缓存动态内容中相对稳定的局部(如导航、侧栏、页脚等)。
确认并配置缓存组件
片段缓存依赖全局 cache 组件。若未配置,缓存将静默失效(不报错但不生效)。在 config/web.php 的 'components' 数组中必须定义:
- 使用文件缓存(开发/轻量环境):
'cache' => ['class' => 'yii\caching\FileCache'] - 使用 Redis(推荐生产环境):
'cache' => [ 'class' => 'yii\redis\Cache', 'redis' => ['hostname' => 'localhost', 'port' => 6379, 'database' => 0] ] - 注意:Yii 2.0.45 默认不启用 APCu 或 Memcached,如需使用,须手动安装扩展并配置对应类(如
yii\caching\ApcCache)
在视图中启用片段缓存
在 views/xxx/index.php 等视图文件中,用以下结构包裹待缓存区域:
<?php if ($this->beginCache('footer_menu', [
'duration' => 3600, // 缓存 1 小时(秒)
'enabled' => YII_DEBUG ? false : true, // 调试时禁用
])): ?>
<!-- 这里放你的动态生成代码,例如 foreach 循环菜单 -->
<footer class="footer"><div class="container">
<?php foreach ($categories as $cate): ?><h4>= Html::encode($cate->name) ?></h4>
<?php endforeach; ?>
</div>
</footer><?php $this->endCache(); endif; ?>
-
'footer_menu'是唯一缓存键,建议语义化且避免冲突 -
'duration'必填,单位为秒;设为0表示永不过期(不推荐) -
'enabled'可用于按环境开关缓存,避免开发时数据不刷新
添加缓存依赖提升数据一致性
当缓存内容依赖数据库或文件变化时,仅靠时间过期不够及时。可加入依赖项,使缓存自动失效:
- 数据库变更依赖(推荐用于菜单、分类等):
'dependency' => [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT MAX(updated_at) FROM article_category' ] - 文件变更依赖(如配置型静态内容):
'dependency' => [ 'class' => 'yii\caching\FileDependency', 'fileName' => '@app/config/menu.php' ] - 表达式依赖(按请求参数区分缓存):
'dependency' => [ 'class' => 'yii\caching\ExpressionDependency', 'expression' => 'Yii::$app->language' ]
验证与调试技巧
缓存是否生效不能只看页面效果,需主动验证:
- 清空
runtime/cache/目录(文件缓存)或执行redis-cli FLUSHDB(Redis),再刷新页面,观察首次加载是否变慢(说明缓存重建) - 在缓存块内临时加
<!-- cached at <?= date('H:i:s') ?> -->,两次刷新时间不变即命中缓存 - 开启 Yii 调试工具栏(
yii\debug\Module),查看「Cache」面板中的读写记录 - 注意嵌套缓存:外层缓存时间长于内层时,内层即使过期也不会更新——应避免深层嵌套或统一管理过期策略











