簡介
Zend_Cache 提供了一個緩存任何數據的一般方法. 在Zend Framework中緩存由前端操作,同時通過後端適配器(File, Sqlite, Memcache...)和
一個靈活的IDs和Tags系統(標識符和標記系統)存儲緩存紀錄.使用此方法,
易於刪除特定類型的紀錄(例如:"刪除所有標記為tag的紀錄") 模塊(Zend_Cache_Core) 的核心是通用,靈活和可配置.對於特定的需要,為了便捷,
這裡有一些繼承自Zend_Cache_Core的前端: Output, File, Function 和 Class
調用 Zend_Cache::factory()取得一個前端 Zend_Cache::factory() 實例化正確的對象並把他們捆綁到一起. $frontendOptions = array(
'lifeTime' => 7200, // 兩小時的緩存生命期
'automatic_serialization' => true
); $backendOptions = array(
'cache_dir' => './tmp/' // 放緩存文件的目錄
); // 取得一個Zend_Cache_Core 對象
$cache = Zend_Cache::factory('Core',
'File',
$frontendOptions,
$backendOptions);
Caching a database query result 現在有了一個前端,可用緩存任何類型的數據了(開了序列化'serialization'). 結果被緩存後,不再需要連接到數據庫;數據直接在緩存中取回和反序列化 // $cache 在先前的例子中已經初始化了 // 查看一個緩存是否存在:
if(!$result = $cache->load('myresult')) { // 緩存不命中;連接到數據庫 $db = Zend_Db::factory( [...] ); $result = $db->fetchAll('SELECT * FROM huge_table'); $cache->save($result, 'myresult'); } else { // cache hit! shout so that we know
echo "This one is from cache!\n\n"; } print_r($result);
用Zend_Cache 輸出前端緩存輸出 通過加入條件邏輯,我們'mark up'(標記)那些希望緩存輸出的段(sections),
在start() 和 end()方法間封裝這些section(這類似第一個例子,並且是緩存的核心策略). 在內部,像往常一樣輸出數據,當執行到end()方法時,所有之前的輸出都被緩存.
在下一次運行時,整個段(end()方法調用前的代碼)將被跳過執行,直接從Cache中取回數據(只要緩存紀錄是有效的). $frontendOptions = array(
'lifeTime' => 30, // cache lifetime of 30 seconds
'automatic_serialization' => false // this is the default anyway
s // 翻譯時實驗系統為Windows,請使用Windows的讀者修改cacheDir的路徑為實際的路徑
$backendOptions = array('cache_dir' => './tmp/'); $cache = Zend_Cache::factory('Output',
'File',
$frontendOptions,
$backendOptions); // 傳遞一個唯一標識符給start()方法
if(!$cache->start('mypage')) {
// output as usual: echo 'Hello world! ';
echo 'This is cached ('.time().') '; $cache->end(); // the output is saved and sent to the browser
} echo 'This is never cached ('.time().').'; 注意我們兩次輸出了time()的結果;為演示目的第二次的time()調用是動態的. 這是因為第一個數組在緩存段中輸出,因此輸出是被緩存了.
30秒後(我們設置了lifetime為30秒)由於緩存紀錄超時而變得無效了,
第一個數字再次更新,同時於第二個時間匹配(相同) 在使用Zend_Cache是特別要注意的Cache標識(傳遞給save()和start()的參數). 緩存原理 在Zend_Cache中有三個關鍵概念.一是用於標識緩存紀錄的唯一標識符(一個字符串).
二是'lifeTime'指令,正如例子中所見, 它定義了緩存紀錄的生命期(超過該值,緩存紀錄被銷毀). 前端函數(例如. Zend_Cache_Core::get())在緩存不命中時返回false,
這使用戶能處理if(){ ... } 語句中的條件,包含代碼中他們所要緩存(或者跳過)的部分,
最後是否必須保存這些曾經生成的塊(例如: Zend_Cache_Core::save()). Zend_Cache 工廠方法 // We choose a backend (for example 'File' or 'Sqlite'...)
$backendName = '[...]'; // 選擇一個前端(例如'Core', 'Output', 'Page'...)
$frontendName = '[...]'; // 為選擇的前端設置一個選項數組
$frontendOptions = array([...]); // 為選擇的後端設置一個選項數組
$backendOptions = array([...]); // 創建實例(當然,最後兩個參數是可選的)
$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);
標記紀錄 標記是給緩存紀錄分類的一種方法.當使用save()方法保存一個緩存時, 此後不再需要該緩存紀錄使,可以清除所有指定標記的緩存紀錄. $cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC')); 緩存清理 刪除特定id的Cache紀錄,使用remove()方法 $cache->remove('idToRemove'); 在單個操作中刪除多個Cache紀錄,可以使用clean()方法.例如,刪除所有的緩存紀錄: // 清除所有緩存紀錄
$cache->clean(Zend_Cache::CLEANING_MODE_ALL); // 僅清除過期的
$cache->clean(Zend_Cache::CLEANING_MODE_OLD); 如果想刪除標記為'tagA'和'tagC'的緩存項: $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC'));
可用的清除模式有:CLEANING_MODE_ALL, CLEANING_MODE_OLD, CLEANING_MODE_MATCHING_TAG 和
CLEANING_MODE_NOT_MATCHING_TAG. Zend_Cache前端 Zend_Cache_Core 簡介 Zend_Cache_Core是一個特別的前端,因為他是模塊的核心.
它是一個一般化(generic)的緩存前端,並且由其他類擴展
可用選項 caching
cache_id_prefix
lifetime
logging
write_control
automatic_serialization
automatic_cleaning_factor
ignore_user_abort 例子 // 假定已經有 $cache $id = 'myBigLoop'; // cache id of "what we want to cache" if (!($data = $cache->load($id))) {
// cache miss $data = '';
for ($i = 0; $i < 10000; $i++) {
$data = $data . $i;
} $cache->save($data); } // [...] do something with $data (echo it, pass it on etc.)
Zend_Cache_Frontend_Output 簡介
Zend_Cache_Frontend_Output 是一個輸出捕捉前端.
它在PHP中使用輸出緩沖捕獲start() 和 end() 方法間的一切輸出 該前端除了Zend_Cache_Core那些選項外沒有任何特定的選項 // if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) { // output everything as usual
echo 'Hello world! ';
echo 'This is cached ('.time().') '; $cache->end(); // output buffering ends } echo 'This is never cached ('.time().').';
Zend_Cache_Frontend_Function Introduction
A可用的選項 $cache->call('veryExpensiveFunc', $params); // $params is an array
// For example to call veryExpensiveFunc(1, 'foo', 'bar') with
// caching, you can use
// $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))
Zend_Cache_Frontend_Class Introduction
Available options
Examples class test { // Static method
public static function foobar($param1, $param2) {
echo "foobar_output($param1, $param2)";
return "foobar_return($param1, $param2)"; $frontendOptions = array(
'cached_entity' => 'Test' // The name of the class // [...] // The cached call
$result = $cache->foobar('1', '2');
Zend_Cache_Frontend_File Introduction
Available options
Examples
Zend_Cache_Frontend_Page Introduction
Available options (for this frontend in Zend_Cache factory)
Examples Zend_Cache後端 Zend_Cache_Backend_File 此後端把緩存紀錄存儲到文件中去(在一個選定的目錄中).
Zend_Cache_Backend_Sqlite 此後端把緩存紀錄存儲到SQLite數據庫中.
Zend_Cache_Backend_Memcached 本後端把緩存紀錄存儲到memcached服務器. memcached 是一個高性能的,分布式內存對象緩存系統.
要使用此後端,需要一個memecached守護進程(daemon)和 memcache PECL 擴展. 注意 : 使用此後端當設置"doNotTestCacheValidity=true"參數時,不支持"tags"
Zend_Cache_Backend_Apc 此後端通過 APC (Alternative PHP Cache) 擴展把緩存紀錄存儲於共享內存中
(當然為使用此後端,APC是需要的). 注意 : 使用此後端當設置"doNotTestCacheValidity=true"參數時,不支持"tags"
Zend_Cache_Backend_Xcache 整個後端通過 XCache 擴展(它當然需要使用這個後端) 在共享內存裡存儲了緩存記錄。 小心:用這個後端,目前不支持 ”tags“,因為 "doNotTestCacheValidity=true" 參數
Zend_Cache_Backend_ZendPlatform 本後端使用 Zend Platform產品的內容緩存API. 要使用此後端必須安裝Zend Platform. 本後端支持標記(tags),但不支持 CLEANING_MODE_NOT_MATCHING_TAG清除模式. 當使用Zend_Cache::factory()方法時,在字 'Zend' 和 'Platform'之間使用字分隔符-- '-', '.', ' ', or '_'指定此後端: $cache = Zend_Cache::factory('Core', 'Zend Platform'); 此後端沒有選項.