程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> zend framework之zend

zend framework之zend

編輯:PHP基礎知識
 

首先要清楚zend_cache是用於緩存數據的。緩存數據就是在程序第一次執行的時候,把需要緩存的地方進行緩存處理,保存到cache文件或內存中,當下次在運行這段代碼的時候直接從緩存中取出保留的運行結果,而不在運行此程序。
要研究zend_cache就要從工廠實例出手,弄清每一個部分。cache的工廠實例是這樣定義的:
$cache = Zend_Cache::factory($frontendName, $backendName,$frontendOptions,
$backendOptions);然後以此來闡述每一個參數的含義。
$frontendName是前端操作模塊,前段操作模塊共有六種:
1.Core 這是前端的核心緩存,前端的其他類型緩存都繼承自Core,用於緩存變量或數組。
2.File 緩存文件,沒有研究具體用途
3.Output 捕獲並緩存輸出,這個做頁面局部緩存很有用,因為它只捕獲start()到end()之間的代碼,缺點是需要在視圖中寫入相應的代碼。
4.Page 緩存頁面,對提高效率幫助很大,因為一但命中緩存,就直接讀取緩存並輸出,不再執行後面的代碼。可以設定session,cookie,get,post作為產生cache_id的干擾碼。比如不同的cookie產生不同的緩存頁面。缺點是只能整個頁面緩存,不能像smarty那樣實現整頁緩存,但是可以控制局部不緩存。
5.Class 緩存靜態類和對象。
6.Function 緩存函數。
$backendName是後端適配器,後端適配器共有7種:'File', 'Sqlite', 'Memcached', 'Apc', 'ZendPlatform', 'Xcache', 'TwoLevels'。其中File和Memcached最為常用。File是保存緩存結果到文件,Memcached是保存到內存,Sqlite是保存到Sqlite數據庫,ZendPlatform是通過zend平台緩存等等。
$frontendOptions是前端參數:對於core和output可這樣定義:
$frontendOptions = array(
'caching' => true, //開啟緩存,調試程序的時候可以設為false
'lifetime' =>3600, //緩存生命期,就是緩存存在的時間
'automatic_serialization' =>true //自動序列化,存儲數組或者對象數據時一定要打開
);
$backendOptions是後端參數,主要是用來指定保存緩存數據的路徑:
$backendOptions = array(
'cache_dir' => '/tmp', //存放路徑
'file_name_prefix' =>'page_cache' //緩存文件前綴,默認為zend_cache
)

一下列舉一些實例:
實例一:
$frontendOptions = array(
'lifetime' => 3600, // 緩存壽命
'debug_header' => true, // true是打開debug,通常設為false
'regexps' => array(
'^/$' => array('cache' => true), // 所有頁面都緩存
'^/guestbook/' => array('cache' => true), // 緩存guestbook下所有action頁
'^/guestbook/sign' => array('cache' => false), //對guestbook控制器的sign動作不緩存
),
'default_options' => array(
'cache_with_get_variables' => true,
'cache_with_post_variables' => true,
'make_id_with_cookie_variables' => true, // 注意如果開了session要把這個打開
'cache_with_session_variables' => true, // 注意如果開了session要把這個打開
'cache_with_files_variables' => true,
'cache_with_cookie_variables' => true, // 注意如果開了session要把這個打開
)
);
$backendOptions = array(
'cache_dir' => 'C:/cache/', // 緩存存放路徑,必須存在並可寫
);
$cache = Zend_Cache::factory('page',
'File',
$frontendOptions,
$backendOptions);
$cache->start(); // 開始緩存

在這裡需要注意的是:這段程序用於緩存整個頁到文件,debug_header如果設為TRUE,這個選項使緩存頁面輸出一個消息頭,來顯示這是一個被緩存的頁面。cache_with_get_variables選項表示緩存功能可以緩存包含get變量的頁面,make_id_ with_get_variables選項表示所有頁面輸入都必須單獨地緩存頁面。也就是說,同一get變量的兩個值會導致兩個不同的緩存文件。另外通過設定regexps可以來指定哪個控制器的哪個Action將被緩存。當建立工廠實例後,通過調用start()進行緩存。

實例二:
$frontendOptions = array(
'lifeTime' => 7200, // 兩小時的緩存生命期
'automatic_serialization' => true
);

$backendOptions = array(
'cache_dir' => 'c:/dir/' // 放緩存文件的目錄
);
// 取得一個Zend_Cache_Core 對象
$cache = Zend_Cache::factory('Core','File',$frontendOptions,$backendOptions);
if(!$result = $cache->load('myresult')) {//查詢是否存在id為myresult的緩存
// 緩存不命中;連接到數據庫
$params = array ('host' => 'localhost',
'username' => 'root',
'password' => 'root',
'dbname' => 'do');
$db = Zend_Db::factory('MYSQLI', $params);//定義適配器
$result = $db->fetchAll('SELECT * FROM xxx');//查詢數據庫並取值
$cache->save($result, 'myresult'); //把結果保存到id為myresult的緩存中
} else {
// cache hit! shout so that we know
echo "This one is from cache!\n\n";//命中輸出
}
print_r($result);

由於core前端模塊適用於緩存變量和數組,因此對數據庫數據的緩存依賴於core,同時我們要注意到id也就是程序中的myresult,它唯一標識一個緩存,myresult是自己人為定義的,它的名字可隨便起,但不能重復。第一次load的時候肯定不命中,第二次就開始緩存了。

實例三:
$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' => 'c:/cache/');
$cache = Zend_Cache::factory('Output',
'File',
$frontendOptions,
$backendOptions);
// 傳遞一個唯一標識符給start()方法
if(!$cache->start('ss')) {
// output as usual:
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // the output is saved and sent to the browser
}else{
echo "wo yi jing bei huan cun!";
}
echo 'This is never cached ('.time().').';

此實例再次證明了output緩存的只是start和end之間的數據,另外還要注意start中的參數ss即為cache的id。

也許給了例子,還是不明白怎麼在zend裡面用,這三個例子如果寫在controller文件中時,可以把它們寫在init方法的下面,這樣當初始化時及執行此程序,在controller中init首先執行,當然也可以寫到Action中,直接調用就可以。我自己認為像page,寫在init中還是比較好的。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved