一、首先在main.php配置缓存组件
在components里面添加cache项。代码如下:
// application components 'components'=>array( 'user'=>array( // enable cookie-based authentication 'allowAutoLogin'=>true, ), 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=yiitest', 'emulatePrepare' => true, 'username' => 'root', //数据库用户 'password' => 'root', //密码 'charset' => 'utf8', //数据交互字符集 'tablePrefix' => 'tbl_', //数据库表的前缀 'enableParamLogging'=> true, //在页面底部显示sql语句绑定的参数信息 'enableProfiling' => true, //显示没个sql语句运行的时间 ), 'errorHandler'=>array( // use 'site/error' action to display errors 'errorAction'=>'site/error', ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), // uncomment the following to show log messages on web pages //可以帮助我们获得应用的日志信息(包括运行的sql语句) array( 'class'=>'CWebLogRoute', ), ), ), 'cache'=> array( 'class'=>'system.caching.CFileCach', //定义缓存的类型。类型见system.caching下的文件 ), ),
在模板的页面需要缓存的片段前后加以判断即可。如下:
/*这里是缓存的判断,若缓存中有Goods片段,则直接取缓存。
参数duration为过期时间,varyByParam为页面参数,即为同一路由下不同的page参数保存不同的缓存,也可为id
dependency为缓存依赖条件。class为依赖的类型,sql为依赖条件的语句(依赖商品总价格,总的价格变化时则缓存无效)
*/
<?php if ($this->beginCache('Goods' ,
array( 'duration'=>3600,
'varyByParam'=>'page',
'dependency'=>array(
'class' => 'system.caching,dependencies.CDbCacheDependency',
//依赖类型为数据库依赖
'sql' =>'select sum(goods_price) from {{goods}}',
//依赖条件为商品的总价格
),
))){?> <table class="goods_list"> <tr> <td><?php echo $form->labelEx($goods_model , 'id');?></td> <td><?php echo $form->labelEx($goods_model , 'goods_name');?></td> <td><?php echo $form->labelEx($goods_model , 'goods_price');?></td> <td><?php echo $form->labelEx($goods_model , 'goods_category');?></td> <td><?php echo $form->labelEx($goods_model , 'goods_add_time');?></td> <td>相关操作</td> </tr> <?php foreach ( $goods_info as $_k=>$_v ){ ?> <tr> <td><?php echo $_v->id;?></td> <td><?php echo $_v->goods_name;?></td> <td><?php echo $_v->goods_price;?></td> <td><?php echo $_v->goods_category;?></td> <td><?php echo $_v->goods_add_time;?></td> <td><a href="./index.php?r=admin/goods/update&id=<?php echo $_v->id;?>">修改</a> <a onclick="javascript:return confirm('确认删除?')" href="./index.php?r=admin/goods/delete&id=<?php echo $_v->id;?>" class="delete_goods">删除</a></td> </tr> <?php } ?> </table> <?php $this->endCache();}?>
缓存文件保存在runtime下。
缓存依赖:我们的商品信息缓存可以自定义设置过期时间,根据具体需求业务类型决定,如果商品信息在没有过期之内数据库被修改了。这时缓存的数据就是错误的。这种情况可以通过缓存依赖来解决。
缓存依赖条件:假如我们依赖的条件是总的商品价格,如果价格发生变化,则需要时缓存过期。如果一个商品价格加5元,另一个商品价格减少5元,这样的话是不会更新缓存的。(因为条件总商品价格不变)
缓存依赖:增加参数 dependency