我們從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以及開源框架
