ThinkPHP緩存機制


我們從S函數分析ThinkPHP框架緩存機制,像快速緩存、查詢緩存、SQL解析緩存、靜態緩存根本上都是在這種機制下運行,只是切入方式不同。

首先,看下S函數定義:

/**

 * 緩存管理

 * @param mixed $name 緩存名稱,如果為數組表示進行緩存設置

 * @param mixed $value 緩存值

 * @param mixed $options 緩存參數

 * @return mixed

 */

function S($name,$value='',$options=null) {

    static $cache   =   '';

    if(is_array($options) && empty($cache)){

        // 緩存操作的同時初始化

        $type       =   isset($options['type'])?$options['type']:'';

        $cache      =   Think\Cache::getInstance($type,$options);

    }elseif(is_array($name)) { // 緩存初始化

        $type       =   isset($name['type'])?$name['type']:'';

        $cache      =   Think\Cache::getInstance($type,$name);

        return $cache;

    }elseif(empty($cache)) { // 自動初始化

        $cache      =   Think\Cache::getInstance();

    }

    if(''=== $value){ // 獲取緩存

        return $cache->get($name);

    }elseif(is_null($value)) { // 刪除緩存

        return $cache->rm($name);

    }else { // 緩存數據

        if(is_array($options)) {

            $expire     =   isset($options['expire'])?$options['expire']:NULL;

        }else{

            $expire     =   is_numeric($options)?$options:NULL;

        }

        return $cache->set($name, $value, $expire);

    }

}

這個函數封裝了緩存的創建、獲取、刪除操作,這部分功能很清新,關鍵在創建cache對象的時候函數調用了緩存基類:Think\Cache::getInstance  靜態方法,通過這個方法框架支持:File、Db、Apc、Memcache、Shmop、Sqlite、Xcache、Apachenote、Eaccelerator不同類型的緩存方式,為了弄清楚支持這些緩存類型的代碼結構,那么我們把這個方法代碼看下:

    /**

     * 取得緩存類實例

     * @static

     * @access public

     * @return mixed

     */

    static function getInstance($type='',$options=array()) {

       static $_instance =   array();

       $guid  =   $type.to_guid_string($options);

       if(!isset($_instance[$guid])){

           $obj   =   new Cache();

           $_instance[$guid] =   $obj->connect($type,$options);

       }

       //print_r($_instance);

       return $_instance[$guid];

    }

 

該方法調用了本類connect方法,在看下代碼:

/**

     * 連接緩存

     * @access public

     * @param string $type 緩存類型

     * @param array $options  配置數組

     * @return object

     */

    public function connect($type='',$options=array()) {

        if(empty($type))  $type = C('DATA_CACHE_TYPE');

        $class  =   strpos($type,'\\')? $type : 'Think\\Cache\\Driver\\'.ucwords(strtolower($type));           

        if(class_exists($class))

            $cache = new $class($options);

        else

            E(L('_CACHE_TYPE_INVALID_').':'.$type);

        return $cache;

    }

真正的區別緩存類型的代碼在這里了,“Think\\Cache\\Driver\” 定義了框架支持的緩存類型,每種支持的緩存類型的文件在這里就是一個類文件。如果,沒有定義緩存類型,框架獲取了配置文件中“ C('DATA_CACHE_TYPE')”的默認值,我們再看下框架默認定義的緩存類型是什么:'DATA_CACHE_TYPE'       =>  'File',  很明顯,框架默認使用的是File類型緩存機制。當然,弄清楚這樣的代碼框架,那天有興趣我們自己也能定義一款更適用項目的緩存類型,不是嘛!!

有很多編程大神並不喜歡使用ThinkPHP提供的S等封裝的函數,更喜歡直接使用Cache\Driver下的類,通過上面的了解,我們也可以試試吧^_^!

 

制作人:飛虎                                           無兄弟不編程!
===========================================================================
歡迎加QQ群進行更多交流:305397511     專注於php、mysql、jquery以及開源框架

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM