一、数据缓存默认配置项 yii/config/web.php
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'eddycjy19950728',
],
'cache' => [
'class' => 'yii\caching\FileCache', //默认为文件储存
],
二、数据缓存组件引入
$cache = \YII:$app->cache;
三、操作数据缓存
yii\caching\Cache::get():通过一个指定的键(key)从缓存中取回一项数据。如果该项数据不存在于缓存中或者已经过期/失效,则返回值 false。
yii\caching\Cache::set():将一项数据指定一个键,存放到缓存中。
yii\caching\Cache::add():如果缓存中未找到该键,则将指定数据存放到缓存中。
yii\caching\Cache::mget():通过指定的多个键从缓存中取回多项数据。
yii\caching\Cache::mset():将多项数据存储到缓存中,每项数据对应一个键。
yii\caching\Cache::madd():将多项数据存储到缓存中,每项数据对应一个键。如果某个键已经存在于缓存中,则该项数据会被跳过。
yii\caching\Cache::exists():返回一个值,指明某个键是否存在于缓存中。
yii\caching\Cache::delete():通过一个键,删除缓存中对应的值。
yii\caching\Cache::flush():删除缓存中的所有数据。
//往缓存当中写数据
$cache->add('键值','数值',有效期); //当缓存中已存在相同的键值时,后者不会叠加前者,值还是后者
//修改缓存中数据
$cache->set('键值','数值',有效期);
//删除缓存数据
$cache->delete('键值');
//清空缓存数据
$cache->flush();
四、缓存依赖
1.文件依赖
$dependency = new \yii\caching\FileDependency(['fileName' => '文件名字']);
$cache->add('键值','数据',有效期,$dependency);
$cache->set('键值', '数据', 30, $dependency);
$data = $cache->get('键值');
2.表达式依赖
$dependency = new \yii\caching\ExpressionDependency(
['expression'=>'\YII::$app->request->get("name")]'
);
3.DB依赖
$dependency = new \yii\caching\DbDependency(
['sql' => SQL语句]
);
4.链式依赖
5.组依赖
下面是可用的缓存依赖的概况:
yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。
yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
yii\caching\GroupDependency:将一项缓存数据标记到一个组名,你可以通过调用 yii\caching\GroupDependency::invalidate() 一次性将相同组名的缓存全部置为失效状态。
五、查询缓存
$db = new yii\db\Connection();
查询缓存有两个通过 yii\db\Connection 设置的配置项:
yii\db\Connection::queryCacheDuration: 查询结果在缓存中的有效期,以秒表示。如果在调用 yii\db\Connection::beginCache() 时传递了一个显式的时值参数,则配置中的有效期时值会被覆盖。
yii\db\Connection::queryCache: 缓存应用组件的 ID。默认为 'cache'。只有在设置了一个有效的缓存应用组件时,查询缓存才会有效。
六、片段缓存
存在该缓存则返回FALSE进行读取,否则不存在则TRUE进行缓存
if ($this->beginCache('键值',有效期)) {
//有效期默认为0,则为永不过期
// ... 内容 ...
$this->endCache();
}
/*
* 设置缓存配置
*/
$dependency = [
'class' => 'yii\caching\DbDependency', //使用的缓存依赖类型
'sql' => 'SELECT MAX(updated_at) FROM post', //所缓存的sql语句
];
if ($this->beginCache($id, ['dependency' => $dependency])) {
// ... 在此生成内容 ...
$this->endCache();
}
//缓存开关
$enable = true;
if ($this->beginCache($id, ['enable' => $enable])) {
// ... 在此生成内容 ...
$this->endCache();
}
如果缓存中存在该内容,yii\base\View::beginCache() 方法会将已缓存内容输出。
否则,若不存在该缓存,则生成逻辑,生成的内容将存储在缓存中。
*片段缓存嵌套,需要注意内外的有效期导致的问题。
七、页面缓存
public function behaviors(){
return [
[
'class' => 'yii\filters\PageCache', //页面缓存
'duration' =>1000, //有效期
'only' =>['index','test'], //仅在该控制器(index,test)执行页面缓存
'dependency' =>[
'class' =>'yii\caching\FileDependency', //使用的缓存依赖方式
'fileName' =>'hw.txt' //缓存的文件(注 当文件修改后,缓存也同时失效)
]
]
];
}
public function actionIndex(){
echo "我是被缓存的";
}