在項目中,合理的使用緩存對性能有較大的幫助。ThinkPHP提供了方便的緩存方式,包括數據緩存、靜態緩存和查詢緩存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在內的動態數據緩存類型,以及可定制的靜態緩存規則,并提供了快捷方法進行存取操作。
數據緩存
在ThinkPHP中進行緩存操作,一般情況下并不需要直接操作緩存類,因為系統內置對緩存操作進行了封裝,3.1版本推薦的數據緩存方法是cache方法,基本的用法是:
(
3.1.2版本cache方法已經并入S方法,所以cache方法不再建議使用,直接使用S方法即可,和下文描述的cache方法用法一致)
1 緩存初始化
cache(array('type'=>'xcache','expire'=>60));
緩存初始化可以支持的參數根據不同的緩存方式有所區別,常用的參數是:
expire | 緩存有效期(時間為秒) |
prefix | 緩存標識前綴 |
type | 緩存類型 |
核心版本只有File緩存方式的支持,其他的緩存方式支持需要下載單獨的緩存驅動,并放入系統目錄的Extend/Driver/Cache/下面,否則會出現不支持緩存類型的錯誤提示。有些緩存方式會有一些自身特殊的參數,例如Memcache緩存,還需要配置其他的參數:
cache(array('type'=>'memcache','host'=>'192.168.1.10','port'=>'11211','prefix'=>'think','expire'=>60));
對于全局的緩存方式,一般我們建議添加prefix(緩存前綴)參數用以區分不同的應用,以免混淆。
2 緩存設置
cache('a',$value);
會按照緩存初始化時候的參數進行緩存數據,也可以在緩存設置的時候改變參數,例如:
cache('a',$value,300);// 緩存數據300秒
甚至改變之前的緩存方式或者更多的參數:
cache('a',$value,array('type'=>'file','expire'=>300));// 采用文件方式緩存數據300秒
如果你在緩存設置的時候采用上面的數組方式傳入參數的話,會影響到后面的緩存存取。
3 緩存讀取
$value = cache('a');
緩存讀取的是前面緩存設置的值,這個值會受緩存初始化或者緩存設置的時候傳入的參數影響。
如果緩存標識不存在或者已經過期,則返回false,否則返回緩存值。
4 緩存刪除
cache('a',null);
刪除緩存標識為name的緩存數據。
如果要切換緩存方式,可以再次進行緩存初始化操作或者使用下面的方式:
$cache = cache(array('type'=>'xcache','prefix'=>'think','expire'=>600));
$cache->name = 'value'; // 設置緩存
$value = $cache->name; // 獲取緩存
unset($cache->name); // 刪除緩存
如果你設置了緩存前綴的話,對應的緩存操作只是對應該緩存前綴標識的,不會影響其他的緩存。
數據緩存可以支持緩存隊列,簡單的說就是可以限制緩存的數量,只需要在初始化的時候指定length參數:
cache(array('type'=>'xcache','length'=>100,'expire'=>60));
設置了length參數后,系統只會緩存最近的100條緩存數據。
快速緩存
如果你僅僅是希望用文件的方式緩存一些簡單的數據,并且沒有有效期的概念,那么系統還提供了一個快速緩存方法F可以用來更快的操作。
快速緩存Data數據,默認保存在DATA_PATH目錄下面
F('data',$Data);
快速緩存Data數據,保存到指定的目錄
F('data',$Data,TEMP_PATH);
獲取緩存數據
$Data = F('data');
刪除緩存數據
F('data',NULL);
F方法支持自動創建緩存子目錄,在DATA_PATH目錄下面緩存data數據,如果User子目錄不存在,則自動創建:
F('User/data',$Data);
3.1.2版本開始F方法支持使用通配符批量刪除功能,使用如下:
F('User/*',NULL);
表示刪除DATA_PATH.'User/'目錄下面的數據緩存。
系統內置的數據字段信息緩存就是用了快速緩存機制。
查詢緩存
對于及時性要求不高的數據查詢,我們可以使用查詢緩存功能來提高性能,而且無需自己使用緩存方法進行緩存和獲取。
查詢緩存功能支持所有的數據庫,并且支持所有的緩存方式和有效期。
在使用查詢緩存的時候,只需要調用Model類的cache方法,例如:
$Model->cache(true)->select();
如果使用了cache(true) ,則在查詢的同時會根據當前的查詢SQL生成查詢緩存,默認情況下緩存方式采用DATA_CACHE_TYPE參數設置的緩存方式(系統默認值為File表示采用文件方式緩存),緩存有效期是DATA_CACHE_TIME 參數設置的時間,也可以單獨制定查詢緩存的緩存方式和有效期:
$Model->cache(true,60,'xcache')->select();
表示當前查詢緩存的緩存方式為xcache,并且緩存有效期為60秒。
同樣的查詢,如果沒有使用cache方法,則不會獲取或者生成任何緩存,即便是之前調用過Cache方法。
查詢緩存只是供內部調用,如果希望查詢緩存開放給其他程序調用,可以指定查詢緩存的Key,例如:
$Model->cache('cache_name',60)->select();
則可以在外部通過S方法直接獲取查詢緩存的內容,
$value = S('cache_name');
除了select方法之外,查詢緩存還支持find和getField方法,以及他們的衍生方法(包括統計查詢和動態查詢方法)。具體應用的時候可以根據需要選擇緩存方式和緩存有效期。
靜態緩存
要使用靜態緩存功能,需要開啟HTML_CACHE_ON 參數,并且使用HTML_CACHE_RULES配置參數設置靜態緩存規則文件 。
靜態規則的定義方式如下:
'HTML_CACHE_ON'=>true, // 開啟靜態緩存
'HTML_FILE_SUFFIX' => '.shtml', // 設置靜態緩存后綴為.shtml
'HTML_CACHE_RULES'=> array(
'ActionName(小寫)' => array('靜態規則', '靜態緩存有效期', '附加規則'),
'ModuleName(小寫)' => array('靜態規則', '靜態緩存有效期', '附加規則'),
'ModuleName(小寫):ActionName(小寫)' => array('靜態規則', '靜態緩存有效期', '附加規則'),
'*' => array('靜態規則', '靜態緩存有效期', '附加規則'),
//…更多操作的靜態規則
)
靜態緩存文件的根目錄在HTML_PATH 定義的路徑下面,并且只有定義了靜態規則的操作才會進行靜態緩存。
第一種是定義全局的操作靜態規則,例如定義所有的read操作的靜態規則為:
'read'=>array('{id}','60')
其中,{id} 表示取$_GET['id'] 為靜態緩存文件名,第二個參數表示緩存60秒
第二種是定義全局的模塊靜態規則,例如定義所有的User模塊的靜態規則為:
'user:'=>array('User/{:action}_{id}','600')
其中,{:action} 表示當前的操作名稱
第三種是定義某個模塊的操作的靜態規則,例如,我們需要定義Blog模塊的read操作進行靜態緩存
'blog:read'=>array('{id}',0)
有個別特殊的規則,例如空模塊和空操作的靜態規則的定義,可以使用下面的方式:
'empty:index'=>array('{:module}_{:action}',0) // 定義空模塊的靜態規則
'User:_empty'=>array('User/{:action}',0) // 定義空操作的靜態規則
第四種方式是定義全局的靜態緩存規則,這個屬于特殊情況下的使用,任何模塊的操作都適用,例如
'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
根據當前的URL進行緩存
靜態規則是用于定義要生成的靜態文件的名稱,靜態規則的定義要確保不會沖突,寫法可以包括以下情況:
1、使用系統變量 包括 _GET _REQUEST _SERVER _SESSION _COOKIE
格式:
{$_×××|function}例如:
{$_GET.name}
{$_SERVER. REQUEST_URI|md5}
2、使用框架特定的變量
例如:{:app}、{:group} 、{:module} 和{:action} 分別表示當前項目名、分組名、模塊名和操作名。
3、使用_GET變量
{var|function} 也就是說 {id} 其實等效于 {$_GET.id}
4、直接使用函數
{|function} 例如:
{|time}
5、支持混合定義,例如我們可以定義一個靜態規則為:
'{id},{name|md5}'
在{}之外的字符作為字符串對待,如果包含有”/”,會自動創建目錄。
例如,定義下面的靜態規則:
{:module}/{:action}_{id}
則會在靜態目錄下面創建模塊名稱的子目錄,然后寫入操作名_id.shtml 文件。
靜態有效時間 單位為秒。如果不定義,則會獲取配置參數HTML_CACHE_TIME 的設置值,如果定義為0則表示永久緩存。
附加規則通常用于對靜態規則進行函數運算,例如
'read'=>array('Think{id},{name}','60', 'md5')
翻譯后的靜態規則是 md5('Think'.$_GET['id']. ', '.$_GET['name']);
和靜態緩存相關的配置參數包括:
HTML_CACHE_ON 是否開啟靜態緩存功能
HTML_FILE_SUFFIX 靜態文件后綴 慣例配置的值是 .html
HTML_CACHE_TIME 默認的靜態緩存有效期 默認60秒 可以在靜態規則定義覆蓋
總結
要善于利用ThinkPHP的緩存功能,更重要的是區分什么時候用何種緩存方式更加有效。緩存也不是萬能的,沒有緩存是萬萬不能的^_^