1、Zend_Cache快速瀏覽html
Zend_Cache
提供了一個緩存任何數據的通常方法.前端
在Zend Framework中緩存由前端操做,同時經過後端適配器(File
, Sqlite
, Memcache
...)和 一個靈活的IDs和Tags系統(標識符和標記系統)存儲緩存紀錄.模塊(Zend_Cache_Core
) 的核心是通用,靈活和可配置.對於特定的須要,爲了便捷,這裏有一些繼承自Zend_Cache_Core
的前端: Output
, File
, Function
和 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中取回緩存紀錄.
必須使用 |
(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_ALL
, CLEANING_MODE_OLD
, CLEANING_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,以避免在某些狀況下緩存崩潰。 |
// 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