Yii2.0 缓存

Yii支持:数据缓存/片段缓存/分页缓存/HTTP缓存

缓存配置:

缓存前缀

在common/config/main.php

components => [
	'cache' => [
		'class' => 'yii\caching\ApcCache',
		'keyPerfix' => 'myapp',// 自定义前缀
	],
];

简单数据缓存

$data = Yii::$app->cache->get('data');
if($data === false){
	$data = Post::find()->count();
	// 写入缓存
	Yii::$app->cache->set('data', $data, 60); // 设置缓存时间为60s
}

其他方法: add():如果缓存中未找到该键,则将指定数据放到缓存中

multiGet(): 通过指定的多个键,从缓存中取出多项数据

multiSet(): 将多项数据写入缓存,每项数据对应一个键

multiAdd(): 将多项数据写入缓存,每项数据对应一个键

exists(): 返回一个,指明某个键是否存在缓存中

delete(): 通过一个键,删除对应的缓存中的键值

flush(): 删除缓存中的所有数据

缓存依赖

缓存依赖是yii\caching\Dependency派生类的对象,

这个对象可以设置一个缓存依赖的条件,

当条件发生变化时候,缓存会失效.

常用的缓存依赖:

DbDependency : 如果指定的sql语句的查询结果发生了变化,则依赖改变

FileDependency : 如果文件的最后修改时间发生了变化,则依赖改变

ChainedDependency : 如果依赖链上任何一个依赖发生了变化,则依赖改变

ExpressiongDependency : 如果指定的php表达式执行结果发生了变化,则依赖改变

GroupDenpendency : 将一项缓存标记到一个组名,可以通过调用对象的 invalidate() 一次性将相同的缓存全部设置为失效状态

如:

$data = Yii::$app->cache->get('data');

$dependency = new DbDependency(['sql'=>'select count(id) from post'])

if($data === false){
	$data = Post::find()->count();
	// 写入缓存
	Yii::$app->cache->set('data', $data, 600, $dependency); // 设置缓存时间为60s
}

片段缓存(可以嵌套使用)

$dependency = new Dependency(['sql'=>'select count(id) from post']);
if($this->beginCache('cache',['duration'=>600],['dependency'=>$dependency])){
	echo TagsCloudWiget::wiget(['tags'=>$tags]);
	$this->endCache();
}

页面缓存

在controllers/***Controller.php 中的 behaviors() 方法中 设置

如: PostController.php

'pageCache' => [
	'class' => 'yii\fiters\PageCache',
	'onle' => ['index', ],// 指定需要缓存的页面
	'duration' => 600, // 过期秒数
	'dependency' => [
		'class' => 'yii\caching\DbDependency',
		'variations'=>[ // 缓存变化
			Yii::$app->language,
			Yii::$app->request->get('page'),
			Yii::$app->request->get('PostSearch'),

		],// 缓存变化
		'sql' => 'select count(id) from post',
	],
],

HTTP缓存

HTTP缓存是利用客户端来缓存页面, 节省页面的生成和传输是时间

有三种: yii\filters\HttpCache::lastModified

yii\filters\HttpCache::etagSeed

yii\filters\HttpCache::cacheControlHeader

Last-Modified头:

Last-Modified头使用时间戳标明页面自上次客户端缓存后是否被修改过.

通过lastModified属性向客户端发送Last-Modified头.

该属性应该为PHP callable类型,返回的是页面修改时的unix时间戳.

ETag 头:

ETag 使用一个哈希值表示页面内容,如果页面内容被修改过,哈希值也会改变,浏览器根据哈希值变化来判断刷新

通过配置 yii\filters\HttpCache::etagSeed 属性向客户端发送ETag头

Cache-Control头

Cache-Control头指定了页面的常规缓存策略.

通过配置 yii\filters\HttpCache::cacheControlHeader 属性发送相应的头信息.

在controllers/***Controller.php 中的 behaviors() 方法中 设置

'httpCache' => [
	'class' =>'yii\filters\HttpCache',
	'only' => ['datail'],// only指定缓存的页面
	'lastModified' => function ($action, $parmas){
		$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',// 缓存时间
];



导航