徐善通的随笔

千里之行, 始于足下



在yii2中如何使用页面缓存的方法


页面缓存

页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。可免去所有查询数据库的和代码处理的时间, 大大加快了页面打开的速度

开始使用

这里演示pageCache也就是页面级的缓存使用方法,借助于yii\filters\PageCache
假设当前设置的缓存页面为文章详情页面
在控制器中添加行为

public function behaviors()
{
    return [
        'pageCache' => [
            'class' => 'yii\filters\PageCache',
            'only' => ['index'], // 对哪些方法开启缓存
            'duration' => 3600, // 缓存有效时间,单位秒,设置为0代表永不过期
            'enabled' => true, // 是否启用页面缓存
             //缓存键, 将导致缓存内容更改的因素列表。 每个因素都是表示变体的字符串(例如语言,一个 GET 参数)
            // 如果是缓存文章内容, 需要将所有代表该文章的参数都加上, 比如ID,page等, 同时也可针对ajax
            'variations' => array_merge(Yii::$app->request->get(), [
                Yii::$app->request->isAjax,
            ]),
            // 缓存内容所依赖的依赖项, 也就是判断缓存是否应该更新的依据,如果不应更新, 则每次请求只会执行一次该sql, 直接返回缓存结果
            // 当本次sql的执行结果不等于缓存中的结果时, 刷新缓存, 每次请求都会执行该sql用以判断是否需要更新缓存
            // 针对文章列表页, 可设置sql为 select max(`updated_at`) from article, 
            // 针对有新发布就更新的缓存页面, 可设置sql为 select count(*) from table
            'dependency' => [
                'class' => 'yii\caching\DbDependency',
                'sql' => "SELECT `updated_at` FROM article where id = :id",
                // 可设置绑定参数, 无参数时为空
                'params' => [
                    ':id' => ((int) Yii::$app->request->get('id', 0)),
                ]
            ],
        ],
    ];
}

针对特殊操作执行钩子方法

可实现一个类继承yii\filters\PageCache, 通过重构钩子方法, 方法如下:

  • public boolean beforeAction($action) 在执行操作之前调用此方法
  • public boolean|array beforeCacheResponse() 在启动响应缓存之前调用此方法。 您可以通过返回 false 来重写此方法以取消缓存也可以通过返回数组而 不是 true 来将其他数据存储在缓存条目中。
  • public void afterRestoreResponse($data) 此方法是在响应恢复完成后(但在响应发送之前)调用的。 您可以重写此方法以便在发送响应之前进行最后一刻的准备。

清除或刷新缓存

  • 可手动删除app/runtime/cache清除缓存
  • 可通过类继承重定义常量PAGE_CACHE_VERSION来刷新所有缓存

更多

了解更多请访问官方文档 https://www.yiichina.com/doc/api/2.0/yii-filters-pagecache


作者: 徐善通
地址: https://www.xstnet.com/article-99.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1