之前在Yii中简单记录过缓存的使用。这里我将详细介绍Yii中缓存的使用。Yii中有四种缓存,分别是数据缓存和片段缓存。、页面缓存、HTTP缓存在Yii中使用缓存之前,首先在配置文件main.php文件中配置缓存组件:缓存组件配置'components'=>['cache'=>['class'=>'yii\caching\FileCache',//缓存目录'cachePath'=>'@common/runtime'],]Yii中有多种缓存方式,上面是文件存储缓存,常见的有3种,除了上面的文件存储除了类缓存,还有使用php的APC扩展缓存和数据库存储缓存。APC扩展缓存配置使用php:'components'=>['cache'=>['class'=>'yii\caching\ApcCache',],]使用数据库存储缓存配置:'components'=>['cache'=>['class'=>'yii\caching\DbCache',],]如果使用数据库存储缓存,需要在数据库中创建缓存表缓存。这里我们可以使用Yii自带的migrations工具生成缓存表。参考:https://www.wj0511.com/site/detail.html?id=294生成缓存表。迁移:/***{@inheritdoc}*/publicfunctionsafeUp(){$this->createTable('{{%cache}}',['id'=>$this->char(128)->defaultValue('')->comment('缓存ID'),'expire'=>$this->integer()->defaultValue(0)->comment('过期时间'),'data'=>$this->getDb()->getSchema()->createColumnSchemaBuilder('blob')->comment('缓存数据'),'PRIMARYKEY([[id]],[[expire]])',],'CHARACTERSETutf8COLLATEutf8_unicode_ciENGINE=InnoDBCOMMENT=\'cachetable\'');}/***{@inheritdoc}*/publicfunctionsafeDown(){$this->dropTable('{{%cache}}');}这里注意:由于data字段是blob类型,yii框架没有生成blob类型的方法,需要自己设置blob类型$this->getDb()->getSchema()->createColumnSchemaBuilder('FieldType')2:数据缓存数据缓存是指将一些PHP变量存储在缓存中,使用时再从缓存中获取1:数据缓存的获取与设置数据缓存Yii中使用如下:$cache=Yii::$app->cache;$key='key';//缓存ID$data=$cache->get($key);if($data===false){$data='需要缓存数据';//将$data存入缓存中,以备下次使用$cache->set($key,$data);}上述代码表示:首先判断缓存数据中是否有缓存ID为key的缓存数据,如果有直接获取缓存中的数据。如果没有,则执行set方法将数据添加到缓存中,并返回缓存的数据。将数据添加到缓存的set方法有四个参数。语法结构如下$cache->set($key,$value,$duration=null,$dependency=null);参数说明:key:缓存ID,必填项value:要缓存的数据,必填项duration:缓存过期时间参数,表示缓存的数据可以保留的有效时间(秒)是可选依赖:缓存依赖参数,比如当某个缓存数据的缓存依赖信息发生变化时,此时缓存数据会被设置为无效过期,比如:$cache=Yii::$app->cache;//创建一对测试。txt文件修改时间缓存依赖$dependency=new\yii\caching\FileDependency(['fileName'=>'test.txt']);$cache->set($key,$data,null,$dependency);如上,设置缓存数据。当修改test.txt文件时,此时缓存数据会被设置为无效,常见的过期缓存依赖可以参考Yii框架官网。我不会在这里描述太多。2:清除缓存既然设置了缓存,就一定要有一个清除缓存(1)清除指定缓存ID的缓存数据$cache=Yii::$app->cache;$cache->delete($key);(2)清除所有Cache数据$cache=Yii::$app->cache;$cache->flush();3:查询缓存有时候我们在数据库中查询数据的时候,数据基本上是长时间没有变化的,这时候我们可以使用查询缓存来缓存数据库的查询结果,以提高效率。查询缓存有两种方式:使用yiidbConnection实例实现查询缓存和使用model实现查询缓存(1)使用yiidbConnection实例实现查询缓存$db=Yii::$app->db;$result=$db->cache(function($db){//SQL查询结果将从缓存中获取//如果启用了查询缓存并且在缓存中找到查询结果返回$db->createCommand('SELECT*FROMyii_userWHEREid=1')->queryOne();});缓存SELECT*FROMyii_userWHEREid=1的结果如上(二):使用模型实现查询缓存$result=User::getDb()->cache(function($db){returnUser::findOne(1);});查询User::findOne(1)如上上面的缓存方法有三个参数cache(callable$callable,$duration=null,$dependency=null)参数说明:callable:匿名函数,需要缓存的sql查询数据时长,依赖参数可以查看上面解释3:分片缓存分片缓存是指缓存页面内容中的某个片段。比如在html中,你想缓存一个html片段,避免每次请求都重新生成这个html片段。这时候你可以使用片段缓存实例:);endif;?>同上,html片段片段被缓存。beginCache方法参数说明:beginCache($id,$properties=[])$id:缓存Id$properties:缓存配置数组,缓存数组中常用配置参数有:duration(缓存过期事件,单位秒),dependency(cachedependency),enabled(开关,默认为true,表示启用缓存,false为禁用缓存)如:$dependency=['class'=>'yii\caching\DbDependency','sql'=>'SELECTMAX(updated_time)FROMuser',];if($this->beginCache('key',['duration'=>0,//设置缓存过期时间为3600seconds,'dependency'=>$dependency,//设置缓存依赖,当user表中update_time字段的值发生变化时,缓存失效,重新缓存缓存'enabled'=>Yii:::$app->request->isGet,//当get请求启用缓存时,非get请求禁用缓存])){//...在这里生成内容...$this->endCache();}四:页面缓存页面缓存是指在服务器端缓存整个页面的内容然后当请求相同的页面时,内容将从缓存中获取而不是重新生成。页面缓存由yiifiltersPageCache类提供支持,它是一个过滤器,所以如果需要使用页面缓存,只需要在控制器的behaviors方法中引入yiifiltersPageCache类,如:publicfunctionbehaviors(){return[['class'=>'yii\filters\PageCache',//仅在执行页面操作时启用缓存'only'=>['page'],//缓存过期时间为60秒'duration'=>60,//当user表数据总数发生变化时,页面缓存失效,重新缓存缓存'dependency'=>['class'=>'yii\caching\DbDependency','sql'=>'SELECTCOUNT(*)FROMuser',],],];}五:HTTP缓存上面提到的缓存都是服务器端缓存,客户端缓存也可以在YiiCache中使用来保存相同页面内容的生成和传输时间,以及HTTP缓存HTTP缓存使用的是yiifiltersHttpCache类,它也是一个过滤器,所以需要使用HTTP缓存,引入yiifilte控制器HTTP缓存的behavior方法中的rsHttpCache类可以设置与缓存相关的HTTP头1:Last-Modified头通过配置yiifiltersHttpCache::$lastModified属性将Last-Modified头发送给客户端,如:publicfunctionbehaviors(){return[['class'=>'yii\filters\HttpCache',//仅在执行索引操作时启用HTTPcache'only'=>['page'],//根据页面的最后修改时间生成Last-ModifiedHTTP头,当用户数据发生变化时,HTTP缓存失效,重新生成缓存'lastModified'=>function($action,$params){$query=new\yii\db\Query();返回$query->from('user')->max('updated_time');},]];}2:ETagheaderETag使用哈希值来表示页面的内容。如果页面被修改,散列值也会随之改变。浏览器通过将客户端的哈希值与服务器生成的哈希值进行比较,判断页面是否被修改,进而决定是否重传内容,并通过配置yiifiltersHttpCache::$将ETag头发送给客户端etagSeed属性如:publicfunctionbehaviors(){return[['class'=>'yii\filters\HttpCache',//只在执行视图操作时启用HTTP缓存'only'=>['view'],//根据用户请求的用户名和密码生成一个ETagHTTP标头。当修改用户名和密码数据时,缓存会失效,重新生成缓存'etagSeed'=>function($action,$params){$user=User::findOne(\Yii::$app->请求->get('id'));返回序列化([$user->用户名,$user->密码]);},]];}
