一、在配置文件中php
//在權威指南上是'cache' 其實能夠根據不一樣的緩存組件起不一樣的名稱 //memcache緩存 'memcache' => array( 'class' => 'system.caching.CMemCache', 'servers' => array( array('host' => '127.0.0.1', 'port' => 11211,'weight'=>40)), /* * yii中的memcache能夠理解爲在原始memcache的基礎上進行的一種封裝,好比將key值加密,這樣更安全 * 可是原始的操做就不能用了,若是想用的話,須要下面的配置項 */ /* 'keyPrefix' => '', 'hashKey' => false, 'serializer' => false*/ ) , //數據庫緩存 'dbcache'=>array( 'class'=>'system.caching.CDbCache', /* * 若是沒有下面的connectionID 將會默認的使用sqlite 存儲在runtime目錄下; * 其中的db就是配置的db的數據庫組件,這樣會在對應的數據庫自動創建數據表保存數據 */ 'connectionID'=>'db', ), //文件緩存 'filecache'=>array( 'class'=>'system.caching.CFileCache', //咱們使用CFileCache實現緩存,緩存文件存放在runtime文件夾中 'directoryLevel'=>'2', //緩存文件的目錄深度 ), //APC緩存 /* * 在php5.5+版本 php集成opcache 有實驗證實opcache性能要優於APC */ 'apccache' => 'system.caching.CApcCache', /* 'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', ),*/
二、在控制器中操做html
/* * memcache緩存 */ public function actionMemcacheDemo(){ $key = 'address'; $value = 'china'; Yii::app()->memcache->set($key,$value); echo Yii::app()->memcache->get($key); } /* * 數據庫緩存 */ public function actionDbcacheDemo(){ $key = 'test'; $value = "love"; Yii::app()->dbcache ->set($key, $value); echo Yii::app()->dbcache ->get($key); } /* * 文件緩存 */ public function actionFilecacheDemo(){ Yii::app()->filecache->set('name', 'maozedong'); $name = Yii::app()->filecache->get('name'); echo $name; } /* * APC緩存 */ public function actionApcDemo(){ Yii::app()->apccache->set('name', 'maozedong'); $name = Yii::app()->apccache->get('name'); echo $name; }
開始很疑惑,這個APC在個人印象中是加速php中間碼的,怎麼也能夠用來用來存儲一個數據呢?探究一番以後原來,APC的緩存分兩部分,系統緩存和用戶緩存。參考文章:http://blog.csdn.net/liuxinmingcode/article/details/8058864git
系統緩存 它是指APC把PHP文件源碼的編譯結果緩存起來,而後在每次調用時先對比時間標記。若是未過時,則使用緩存的中間代碼運行。默認緩存 3600s(一小時)。可是這樣仍會浪費大量CPU時間。所以能夠在php.ini中設置system緩存爲永不過時(apc.ttl=0)。不過若是這樣設置,改運php代碼後須要重啓WEB服務器。目前使用較多的是指此類緩存。 用戶數據緩存 緩存由用戶在編寫PHP代碼時用apc_store和apc_fetch函數操做讀取、寫入的。若是數據量不大的話,能夠一試。若是數據量大,使用相似memcache此類的更
由於opcache的性能要比apc好不少,因此下面的apc略過,用opcache來代替。github
上面都是保存的單個的數據,其中memcache緩存將數據放到內存裏,數據庫緩存將數據放在一個表裏,文件緩存將數據放在文件裏,文件在runtime目錄下。sql
三、片斷緩存數據庫
<!--控制器中--> <?php /* * 片斷緩存 在pageList數據表中取出10條數據 */ public function actionPartCache(){ $page_result = Pagelist::model()->findAll(array( 'order' => 'id desc', 'limit' => 10, 'offset' => 0, )); $this->render('partcache',array('page_result'=>$page_result)); } ?> <!--視圖文件中--> <?php if($this->begincache('123123', array('duration'=>3600))) { ?> <?php foreach($page_result as $value){ echo $value->title."<br/>"; }?> <?php $this->endcache(); } ?>
我從一個表中取出10條數據進行緩存,可是嘗試了不少次無效。。。最後是更改了配置文件中,文件緩存的名字爲cache,這下能夠了緩存
//文件緩存 'cache'=>array( 'class'=>'system.caching.CFileCache', //咱們使用CFileCache實現緩存,緩存文件存放在runtime文件夾中 'directoryLevel'=>'2', //緩存文件的目錄深度 ),
看來是有相互的依賴性,yii並無提供beginfilecache,因此必須將文件緩存的配置名爲cache。片斷緩存是在runtime目錄下的cache文件夾。安全
四、文件緩存服務器
文件緩存是在控制裏的filter方法裏session
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),仍然判斷爲失效,從而查詢數據庫,生成整個頁面,再次緩存。
參考文章:http://www.cnblogs.com/me115/archive/2012/12/17/2821184.html
五、關於opcache
在php.ini中引入opcache
能夠在界面看到opcache的效率的插件,地址https://github.com/SchumacherFM/Magento-OpCache
在yii中沒必要配置直接可使用
六、緩存時間 緩存依賴
單個數據緩存 時間依賴
//文件緩存 時間依賴 public function actionFileDemo(){ // Yii::app()->cache->set('address','henan',10); $value = Yii::app()->cache->get('address'); if($value === false){ Yii::app()->cache->set('address','shanghai',10); $value=Yii::app()->cache->get('address'); } echo $value; } //數據庫緩存 時間依賴 public function actionDbTime(){ // Yii::app()->dbcache->set('school','yuanlu',20); $value = Yii::app()->dbcache->get('school'); if($value === false){ Yii::app()->dbcache->set('school','lema',20); $value = Yii::app()->dbcache->get('school'); } echo $value; } //memcache緩存 時間依賴、 public function actionMemTime(){ // Yii::app()->memcache->set('teacher','yuan',20); $value = Yii::app()->memcache->get('teacher'); if($value === false){ Yii::app()->memcache->set('teacher','zhang',20); $value = Yii::app()->memcache->get('teacher'); } echo $value; }
文件和目錄依賴
public function actionFileDemo(){ // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); $value = Yii::app()->cache->get('address333'); if($value === false){ Yii::app()->cache->set('address333','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); $value=Yii::app()->cache->get('address333'); } echo $value; // echo Yii::app()->basePath.'\controller\PagelistController.php'; //echo Yii::app()->basePath; } public function actionFileDemo(){ // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'\controller\PagelistController.php')); // Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'\config')); Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'\config')); $value = Yii::app()->cache->get('addressml'); if($value === false){ Yii::app()->cache->set('addressml','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'\config')); $value=Yii::app()->cache->get('addressml'); } echo $value; // echo Yii::app()->basePath.'\controller\PagelistController.php'; //echo Yii::app()->basePath; }
片斷緩存依賴
<?php if($this->begincache('123123', array( 'duration'=>3600, 'dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'select max(id) from pagelist', ), ))) { ?> <?php foreach($page_result as $value){ echo $value->title."<br/>"; }?> <?php $this->endcache(); } ?> //能夠設置過時時間 duration //設置依賴過時時間 配置dependency 若是數據表中pagelist中的最大的id發生變化,則更新緩存的內容。