yii mysql 缓存_yii中缓存(cache)详解 - 彼岸あ年華ツ

缓存是用于提升网站性能的一种即简单又有效的途径。通过存储相对静态的数据至缓存以备所需,我们可以省去生成

这些数据的时间。在 Yii 中使用缓存主要包括配置和访问缓存组件 。

内部方法

一、缓存配置:

1、单一缓存组件配置:

Yii缓存可以在不同的级别使用。在最低级别,可用来缓存单个数据(数据缓存)。往上一级,我们缓存一个由视图脚本生成的页面片断(片段缓存)。在最高级别,可存储整个页面以便需要的时候直接从缓存读取。本文说明页面缓存的配置及实现效果;

实现分为2步;

1. 在config文件加入缓存组件.

‘cache’ => array (

‘class’ => ‘system.caching.CFileCache’,

‘directoryLevel’ => 2,

),

class标识需要使用的缓存媒介,用途比较广的类型基本都有支持:

CMemCache: 使用 PHP memcache 扩展.

CApcCache: 使用 PHP APC 扩展.

CDbCache: 使用一张数据库表来存储缓存数据。

CFileCache: 使用文件来存储缓存数据。 特别适用于大块数据(例如页面)。

当然,yii也可以支持Redis,需要装一个插件:

http://www.yiibase.com/download/view/32.html

本文实例使用的是文件缓存,对于文件缓存,缓存到的位置为protected/runtime/;directoryLevel设置缓存文件的目录深度;如果缓存页面特别多,这个值需要设置大点,否则每个目录下的页面会很多;

对于除class其他的选项的配置,可以查看各class类中的一些属性

2. 在要做缓存的控制器里定义过滤器。

public function filters() {

return array (

array (

‘COutputCache + post, list’,

‘duration’ => 3600,

‘varyByParam’ => array(‘id’,'page’),

‘dependency’ => array(

‘class’=>’CDbCacheDependency’,

‘sql’=>’SELECT MAX(id) FROM me115_book’,

)

);

}

COutputCache 是用于处理缓存的类,如果只填’COutputCache’,则控制器里所有action都会通过缓存过滤,定义’COutputCache + post, list’,表示只对以下方法进行缓存:actionPost, actionList

duration 是缓存的时间,单位是秒,

varyByParam 是指定一系列GET参数名称列表, 使用相应的值去确定缓存内容的版本,即同一个action用于区分是不同页面的的参数,此处我以id和page来区分不同页面。

除varyByParam以外,还可以采用其他的条件来区分页面:

varyByExpression:指定缓存内容通过自定义的PHP表达式的结果而变化

varyByRoute:指定缓存内容基于请求的路由不同而变化 (controller 和 action)

varyBySession:指定是否缓存内容. 因用户session不同而变化

dependency’指定缓存失效依赖关系:可指定文件或数据库;本文采用的是数据库依赖CDbCacheDependency;

本例指定的是数据库,通过数据表的某个值的变化来确定缓存是否失效。例如,如果在表中新增了一条me115_book记录,即使缓存才过了2分钟(<3600),仍然判断为失效,从而查询数据库,生成整个页面,再次缓存;

检查:

查看当前页面是否缓存,可以dump输出一个当前服务器时间,从而检查当前页面是否已缓存;

优化效果:

优化站点为一个博客站点(me115.com),除了DNS解析转接外,未进行任何优化,优化前的数据为:

86d996f31b27bcdc236a9faf5dcbcfc3.png

aedd56c42854638ccf9aa2447feaad3b.png

首字节时间为842ms;

采用页面缓存之后的效果:

35e5d3ed337d9191721212ca15e801b0.png

4355ada4ffb3f7c05f12ef51c355db7b.png

首字节时间为376ms;html生成的时间大大缩短,后台时间减少了一倍。

当然,通过本图可以看到整个站点的用时还是比较长,主要是在页面组件(css/js/图片)上的下载耗费了不少时间,后续将针对这方面进行前端优化;

2、多缓存组件配置:

详看:http://hudeyong926.iteye.com/blog/1313713

//不管是多缓存配置还是单缓存配置,都需要设置一个默认的cache组件,因为CDbConnection中的 schemaCacheID ,queryCacheID,CCacheHttpSession 中的cacheID ,CUrlManager 中的cacheID, CStatePersister 中的cacheID都是默认的 ’cache'

'cache' => array(

'class' => 'CFileCache',

),

'ApcCache'=>array(

'class'=>'CApcCache',

),

'Dbcache'=>array(

'class'=>'CDbCache',

),

'FileCache'=>array(

'class'=>'CFileCache',

'cachePath'=> '/Webroot/trackstar/protected/runtime/cache/test',

),

'MemCache'=>array(

'class'=>'CMemCache',

'servers'=>array(

array(

'host'=>'server1',

'port'=>11211,

'weight'=>60,

),

array(

'host'=>'server2',

'port'=>11211,

'weight'=>40,

),

),

),

session cache在开启apc cache时可以用,它将seesion存到apc中比存到文件中要快

'cache' => array(

'class' => 'CApcCache',

),

'session' => array(

'class' => 'CCacheHttpSession', //CCacheHttpSession在system.web包里

),

yii如果要使用session.save_handler=memcache 如果需要扩展自定义的session管理方法 ,仅仅需要继承CHttpSession, 重写openSession,readSession,writeSession, destroySession,gcSession 这五个方法即可

3、数据库缓存配置:

//main.php配置文件中 数据库缓存配置,具体参照CDbConnection

'schemaCachingDuration' => 3600, //缓存时间

'schemaCachingExclude' => array(), //不需要缓存的表名数组

'schemaCacheID' => 'cache', //使用的缓存组件

此外,CDbConnection中还有关于数据库查询的缓存配置,不过这里只是一个全局的配置

//查询缓存配置

'queryCachingDuration' => 3600,//缓存时间

'queryCachingDependency' => null, //缓存依赖

'queryCachingCount' => 2, //第一次使用这条sql语句后同样的多少条sql语句需要缓存

'queryCacheID' => 'cache', //使用的缓存组件

需要配置数据库查询缓存,可以使用使用以下方法:

一、CDbConnection中的cache方法

public CDbConnection cache(integer $duration, CCacheDependency $dependency=NULL,integer $queryCount=1)

$duration integer 查询结果保持在缓存中有效的秒数。如果它是0,缓存将被禁用。

$dependency CCacheDependency 当查询结果保存到缓存时,使用的依赖。

$queryCount integer 在调用此方法后,需要缓存的SQL查询的数目。默认为 1,意味着下一条SQL查询将被缓存。

{return} CDbConnection 返回连接实例本身。

public function cache($duration, $dependency=null, $queryCount=1)

{

$this->queryCachingDuration=$duration;

$this->queryCachingDependency=$dependency;

$this->queryCachingCount=$queryCount;

return $this;

}

例子:

$sql = 'SELECT * FROM tbl_post LIMIT 20';

$dependency = new CDbCacheDependency('SELECT MAX(update_time) FROM tbl_post');

$rows = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();

二、CActiveRecord中的cache方法:

public CActiveRecord cache(integer $duration, CCacheDependency $dependency=NULL, integer $queryCount=1)

$duration integer 查询结果可能保持在缓存中有效的秒数。如果这是0,缓存将被禁用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值