正文
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