Yii2 四种缓存的使用


Yii2 四种缓存的使用


正文

yii2的四种缓存是:

  • 数据缓存
  • 片段缓存
  • 页面缓存
  • HTTP 缓存

1、数据缓存的使用例子

数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。

// 尝试从缓存中取回 $data 
$data = $cache->get($key);

if ($data === false) {

    // $data 在缓存中没有找到,则重新计算它的值

    // 将 $data 存放到缓存供下次使用
    $cache->set($key, $data);
}

// 这儿 $data 可以使用了。

缓存依赖

除了超时设置,缓存数据还可能受到缓存依赖的影响而失效。 例如,yii\caching\FileDependency 代表对一个文件修改时间的依赖。 这个依赖条件发生变化也就意味着相应的文件已经被修改。 因此,缓存中任何过期的文件内容都应该被置为失效状态, 对 get() 的调用都应该返回 false。

缓存依赖使用:

在相应的试图view中引入:

use yii\caching\DbDependency;

然后:

// 数据缓存示例
$data = Yii::$app->cache->get('postCount');
$dependency = new DbDependency(['sql' => 'select count(id) from post']);

if ( $data === false ) {
    $data = Post::find()->count();
    Yii::$app->cache->set('postCount', $data, 600, $dependency);
}

// 缓存会检查数据是否已超时。
// 它还会检查关联的依赖是否已变化。
// 符合任何一个条件时都会返回 false。
$data = Yii::$app->cache->get($key);

echo $data;

2、片段缓存的使用例子

片段缓存指的是缓存页面内容中的某个片段。 如果缓存中存在该内容,beginCache() 方法将渲染内容并返回 false, 因此将跳过内容生成逻辑。否则,内容生成逻辑被执行, 一直执行到endCache() 时, 生成的内容将被捕获并存储在缓存中。

if ($this->beginCache($id)) {

    // ... 在此生成内容 ...

    $this->endCache();
}

缓存依赖使用:

在相应的试图view中

use yii\caching\DbDependency;

然后

// 片段缓存示例
$dependency = new DbDependency(['sql' => 'select count(id) from post']);

if ( $this->beginCache('cache', ['duration' => 300], ['dependency' => $dependency]) ) {
    echo TagsCloudWidget::widget(['tags'=>$tags]);
    $this->endCache();
} 

上面两个完整页面示例代码地址:

https://github.com/iBaiYang/yii2_weixi/blob/master/frontend/views/post/index.php

3、页面缓存的使用例子

页面缓存指的是在服务器端缓存整个页面的内容。 随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成。

在相应的控制器的behaviors中:

// 页面缓存
'pageCache' => [
    'class' => 'yii\filters\PageCache',
    'only' => ['index'],
    'duration' => 150,
    'variations' => [
        Yii::$app->request->get('page'),
        Yii::$app->request->get('PostSearch'),
        // Yii::$app->language,
    ],
    'dependency' => [
        'class' => 'yii\caching\DbDependency',
        'sql' => 'select count(id) from post',
    ],
], 

4、HTTP 缓存的使用例子:

HTTP 缓存利用客户端缓存去节省相同页面内容的生成和传输时间。通过配置 yii\filters\HttpCache 过滤器, 控制器操作渲染的内容就能缓存在客户端。HttpCache 过滤器仅对 GET 和 HEAD 请求生效, 它能为这些请求设置三种与缓存有关的 HTTP 头:Last-Modified、 Etag、Cache-Control。

在相应的控制器的behaviors中:

 // HTTP缓存
'httpCache' => [
    'class' => 'yii\filters\HttpCache',
    'only' => ['detail'],
    'lastModified' => function ( $action, $params ) {
        $q = new \yii\db\Query();
        return $q->from('post')->max('update_time');
    },
    'etagSeed' => function ( $action, $params ) {
        $post = $this->findModel( Yii::$app->request->get('id') );
        return serialize( [$post->title, $post->content] );
    },
    'cacheControlHeader' => 'public, max-age=600',
], 

这两个的完整页面示例代码地址:

https://github.com/iBaiYang/yii2_weixi/blob/master/frontend/controllers/PostController.php






参考资料

http://blog.sina.com.cn/s/blog_6aba78b40102x62r.html

Yii 2.0 权威指南 缓存(Caching): 概述(Overview) http://www.yiichina.com/doc/guide/2.0/caching-overview

Yii 2.0 权威指南 缓存(Caching): 数据缓存(Data Caching) https://www.yiichina.com/doc/guide/2.0/caching-data

http://www.weixistyle.com/yii2.php


返回