Zend_Cache的使用

1、Zend_Cache快速瀏覽html

Zend_Cache 提供了一個緩存任何數據的通常方法.前端

在Zend Framework中緩存由前端操做,同時經過後端適配器(FileSqliteMemcache...)和 一個靈活的IDs和Tags系統(標識符和標記系統)存儲緩存紀錄.模塊(Zend_Cache_Core) 的核心是通用,靈活和可配置.對於特定的須要,爲了便捷,這裏有一些繼承自Zend_Cache_Core的前端: OutputFileFunction 和 Class.數據庫

(1)調用 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);
複製代碼

(2)將從數據庫中查詢出來的結果緩存起來數組

如今有了一個前端,可用緩存任何類型的數據了(開了序列化'serialization').例如,可以緩存從昂貴的數據庫查詢中緩存一個結果.結果被緩存後,再也不須要鏈接到數據庫;數據直接在緩存中取回和反序列化.緩存

複製代碼
// $cache 在先前的例子中已經初始化了
// 查看一個緩存是否存在:
if(!$result = $cache->load('myresult')) {
  //緩存不命中;鏈接到數據庫
$db = Zend_Db::factory( [...] );
$result = $db->fetchAll('SELECT * FROM huge_table');
$cache->save($result, 'myresult');//利用zend_cache對象緩存查詢出來的結果
} else {
  //緩存名中,讀出緩存到myresult標籤中的$result內容。
echo "This one is from cache!\n\n";
}
print_r($result);
複製代碼

(3)用Zend_Cache 輸出前端緩存輸出安全

經過加入條件邏輯,咱們'mark up'(標記)那些但願緩存輸出的段(sections),在start() 和 end()方法間封裝這些section(這相似第一個例子,而且是緩存的核心策略). 在內部,像往常同樣輸出你的數據,當執行到end()方法時,全部以前的輸出都被緩存.在下一次運行時,整個段(end()方法調用前的代碼)將被跳過執行,直接從Cache中取回數據(只要緩存紀錄是有效的).服務器

複製代碼
//前端操設置cache的存儲時間,以及是否序列化對象
$frontendOptions = array(
'lifeTime' => 30, // cache lifetime of 30 seconds
'automatic_serialization' => false // this is the default anyway s
);
//後端適配器配置cache的存儲路徑
$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().').';
複製代碼

小結:在使用Zend_Cache是特別要注意的Cache標識(傳遞給save()start()的參數).它必須對於你所緩存的每一個資源惟一,不然不相關的緩存紀錄就會相互覆蓋, 更糟的是,致使錯誤的顯示結果.多線程

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------frontend

2、緩存原理

緩存原理:

在Zend_Cache中有三個關鍵概念.

  一是用於標識緩存紀錄的惟一標識符(一個字符串).

  二是'lifeTime'指令,正如例子中所見, 它定義了緩存紀錄的生命期(超過該值,緩存紀錄被銷燬).

  第三個關鍵概念是條件執行,你的部分代碼可用被跳過,以加速性能.前端函數(例如. Zend_Cache_Core::get())在緩存不命中時返回false,這使用戶能處理if(){ ... } 語句中的條件,包含代碼中他們所要緩存(或者跳過)的部分,最後是否必須保存這些你曾經生成的塊(例如:Zend_Cache_Core::save()).

注意:'緩存命中'是一個術語,它表示當一個緩存紀錄發現可用,是有效的而且是'fresh'的(換言之,就是尚未過時).'Cache miss' 表示當在緩存中找不到須要的數據時,發生緩存不命中. 當一個Cache miss發生是,你必須生成你的數據,並使它被緩存.而對於緩存命中,後端自動透明地從Cache中取回緩存紀錄.

必須使用Zend_Cache::factory()來獲得前端實例.你本身 直接實例化的 前端或者後端 不能按照指望工做.

(1)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);
複製代碼

(2)標記紀錄

標記是給緩存紀錄分類的一種方法.當你使用save()方法保存一個緩存時,你能夠給該緩存紀錄設置一個或多個標記,多個標記以數組形式組織在一塊兒 此後你再也不須要該緩存紀錄使,你能夠清除全部指定標記的緩存紀錄.

$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));

注意:zend_cache的save方法能夠接受第四個變量:$specificLifetime,若是該變量不爲false,則將爲該設定的cache設置一個特定的緩存有效期。

(3)緩存清理

刪除特定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_ALLCLEANING_MODE_OLDCLEANING_MODE_MATCHING_TAG 和 CLEANING_MODE_NOT_MATCHING_TAG. 後面的,正如它名稱所暗示的,在清除操做中組合了一個標記數組,對其中的每一個元素做處理.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 3、Zend_Cache前端

1.1.Zend_Cache_Core

簡介:Zend_Cache_Core是一個特別的前端,由於他是模塊的核心. 它是一個通常化(generic)的緩存前端,而且由其餘類擴展.全部的前端(output,function,class..)繼承自Zend_Cache_Core所以它的方法和選項(描述以下)應該在其餘的前端中可用,因此這裏沒有進行文檔化.這些選項被傳遞給如前面例子中演示的工廠方法.

選項 數據類型 默認值 描述
caching boolean true 打開 / 關閉緩存 (對被緩存腳本的調試很是有用)
cache_id_prefix string null 全部緩存 id 的前綴,若是設置爲 null ,沒有緩存 id 前綴使用。 緩存 id 前綴在緩存裏建立一個命名空間,容許多個程序和網上共享緩存。 每一個程序或網站可使用不一樣的緩存 id 前綴,因此特定的緩存 id 可使用屢次。
lifetime int 3600 緩存生命期(秒), 若是設置爲 null, 緩存永遠有效.
logging boolean false 若是設置爲true,日誌紀錄(經過使用Zend_Log)被激活(可是系統將變慢)
write_control boolean true 打開 / 關閉 寫控制 (the cache is read just after writing to detect corrupt entries),打開寫控制輕微地放慢緩存寫的速度但不影響讀(it can detect some corrupt cache files but it's not a perfect control)
automatic_serialization boolean false 打開 / 關閉自動序列化, 能夠直接用於保存非字符串數據(可是很慢)
automatic_cleaning_factor int 10 關閉 / 調整自動清理過程 (垃圾收集器): 0 表示不自動清理緩存,1 表示自動清理緩存,而且若是x > 1 表示x寫操做後自動隨機清理1次.
ignore_user_abort boolean false 若是設置爲 true,核心將在 save() 方法裏設置 ignore_user_abort PHP flag,以避免在某些狀況下緩存崩潰。
 
1.2.例子
複製代碼
// the complete construction (works in any case)
if (!($cache->test($id))) {
// cache missed
// [...] we make $data
$cache->save($data);
} else {
// cache hit
$data = $cache->load($id);
}
// we do something with $data
複製代碼

2.1 Zend_Cache_Frontend_Output
簡介:Zend_Cache_Frontend_Output 是一個輸出捕捉前端.它在PHP中使用輸出緩衝捕獲start() 和 end() 方法間的一切輸出. 

2.2例子

複製代碼
// 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_File、Zend_Cache_Frontend_Function、Zend_Cache_Front_Page......

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4、Zend_Cache後端

 1.一、Zend_Cache_Backend_File:此後端把緩存紀錄存儲到文件中去(在一個選定的目錄中).

 1.二、文件後端選項:

選項 數據類型 默認值 描述
cache_dir string '/tmp/' 存放緩存文件的目錄
file_locking boolean true 啓用/禁用文件鎖定 : 在比較壞的狀況下,可以避免緩存中斷,但在多線程Web服務器或者NFS文件系統中沒有任何幫助.
read_control boolean true 啓用/禁用讀控制: 若是啓用,控制鍵被嵌入到緩存文件中,而且這個鍵將與讀取後計算出的值進行比較.
read_control_type string 'crc32' 讀控制類型 (僅在讀控制啓用時). 可用的值有: 'md5' (最好但最慢), 'crc32' (安全性稍差,但更快,更好的選擇), 'adler32' (新選擇,比 crc32 快), 'strlen' for a length only test (最快).
hashed_directory_level int 0 Hash目錄結構層次: 0 表示"不使用hash的目錄結構", 1 表示"一級目錄結構" , 2表示"二級目錄"... 次選項在你有成千上萬的緩存文件是可以加速緩存.只有相關的基準測試才能幫助你選擇合適的值.也許1或2是一個好的開始.
hashed_directory_umask int 0700 目錄結構的Unix 掩碼
file_name_prefix string 'zend_cache' 緩存文件前綴;當心使用此選項,由於當清除緩存時,在系統緩存目錄(像 /tmp)中一個太generic的值將致使災難.
cache_file_umask int 0700 緩存文件掩碼
metatadatas_array_max_size int 100 metadatas 數組的內部最大尺寸(除非你知道你在作什麼,不要更改這個值)

2.一、Zend_Cache_Backend_Sqlite:此後端把緩存紀錄存儲到SQLite數據庫中.

2.二、Sqlite 後端選項

選項 數據類型 默認值 描述
cache_db_complete_path (mandatory) string null SQLite數據庫的完整和路徑(包括文件名)
automatic_vacuum_factor int 10 禁用 / 調整自動清理過程. 自動清理過程將對數據庫文件進行碎片整理(and make it smaller) 當clean() 或則 delete() 被調用時 : 0 表示不自動清理; 1 表示自動清理(當調用 delete() 或者 clean() 方法時) ; x (整數) > 1 => 當調用 delete() 或者 clean() 方法時隨機清理1到x次.

3.一、Zend_Cache_Backend_Memcached:本後端把緩存紀錄存儲到memcached服務器. memcached 是一個高性能的,分佈式內存對象緩存系統.要使用此後端,你須要一個memecached守護進程(daemon)和 memcache PECL 擴展.

3.二、Memcached後端選項

選項 數據類型 默認值 描述
servers array array(array('host' => 'localhost','port' => 11211, 'persistent' => true)) 一個memcached服務器數組;其中每一個memcached服務器描述爲一個關聯數組: 'host' => (string) : memcached服務器的名稱, 'port' => (int) : memcached服務器端口, 'persistent' => (bool) : 是否使用到memcached服務器的持久鏈接
compression boolean false 若是你想使用數據壓縮,設置爲true

ps:暫且,zend_cache先記錄這麼多,基本上zend_cache很容易用到,效果很理想!

轉發:https://www.cnblogs.com/terryglp/articles/1959483.html

相關文章
相關標籤/搜索