yii 緩存探究

一、在配置文件中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發生變化,則更新緩存的內容。
相關文章
相關標籤/搜索