PHP程序加速探索之緩存輸出
內(nèi)容緩存輸出 PEAR cache
接下來我們開始探索更常用的緩存技術(shù),這也是本文的重點部份。首先我們使用PEAR中的cache包。PEAR可以將內(nèi)容緩存于文件,數(shù)據(jù)庫或者內(nèi)存中,我們以文件為例。
下面是一個沒有使用緩存的PHP小程序:
pear_content_cache1.php<?php echo '這是內(nèi)容。<P>'; echo '當(dāng)前時間是' . date('M-d-Y H:i:s A', time()) . '<BR>'; ?>
上面這個程序非常簡單,現(xiàn)在我們?yōu)槠浼由暇彺妗?/P>
pear_content_cache2.php
<?php require_once 'Cache/Output.php';
//設(shè)置緩存目錄,必須是可寫的 $cacheDir = './pear_cache'; $cache = new Cache_Output('file',array('cache_dir' => $cacheDir));
//如果nocache變量為空,使用緩存中的內(nèi)容 //如果想獲得最新的內(nèi)容,就要賦值給nocache變量 if (empty($_REQUEST['nocache'])) { // 建立一個獨一的cache標(biāo)識 // 請求+Cookie信息 $cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS)); } else { //想獲得最新的內(nèi)容,ID為空 $cache_id = null; }
//看cache ID對應(yīng)的緩存內(nèi)容是否可用 if ($content = $cache->start($cache_id)) { //緩存已存在,直接輸出,并結(jié)束腳本 echo $content; exit(); }
// 緩存中不存在該內(nèi)容,生成新內(nèi)容并寫入緩存 echo '這是內(nèi)容。<P>'; echo '當(dāng)前時間是' . date('M-d-Y H:i:s A', time()) . '<BR>';
// 把內(nèi)容寫入緩存 echo $cache->end(); ?>
分別刷新這兩個文件,你會發(fā)現(xiàn)pear_content_cache1.php中的“當(dāng)前時間是”這一行中的時間是隨著刷新而變化的,而pear_content_cache2.php中的這一行則不變。這是由于pear_content_cache2.php使用了緩存,將用戶請求的內(nèi)容存入靜態(tài)文件中。當(dāng)用戶再次請求時,它直接從文件中輸出,而不需要用程序動態(tài)生成內(nèi)容。
對于pear_content_cache2.php,如果用戶想要讀取最新的信息,而不是緩存中成舊的信息。那么可以用http://…/pear_content_cache2.php?nocache=1 來訪問,這將禁用緩存功能。刷新一下看看,你將發(fā)現(xiàn)時間會隨之變化。
總結(jié)一下PEAR內(nèi)容緩存類的使用:
1.包含PEAR包 要注意設(shè)對路徑。 2.包含Output.php中的cache類
require_once 'Cache/Output.php';
3.設(shè)置緩存目錄
$cacheDir = './pear_cache';
確認(rèn)這個目錄是可寫的。Cache數(shù)據(jù)將會寫入這個目錄的子目錄中。
4.建立一個輸出緩存對象
$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));
第一個參數(shù)表示我們使用基于“文件”方式的緩存,第二個參數(shù)是一個與緩存目錄相關(guān)聯(lián)的數(shù)組。
5.產(chǎn)生一個唯一的cache ID
$cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));
這里$cache對象的generateID()方法通過提供一個信息數(shù)組(URL, HTTP POST data, 和 HTTP cookie)來獨一無二地標(biāo)識這個請求,與其它請求區(qū)分開來。
6.增加一個邏輯判斷語句看是否對應(yīng)于cacheID的緩存數(shù)據(jù)是否已經(jīng)存在,如果存在,獲取數(shù)據(jù)并結(jié)束腳本。
if ($content = $cache->start($cache_id)) { echo $content; exit(); }
7. 將產(chǎn)生內(nèi)容的代碼放在以上邏輯語句之后,并結(jié)束使用cache對象。
echo $cache->end();
函數(shù)緩存輸出 PEAR cache
PEAR除了可以對輸出的內(nèi)容進行緩存處理外,還可以將對某個函數(shù)的調(diào)用結(jié)果緩存起來。這是個很有趣的功能,如果你的程序要頻繁使用到某個函數(shù),而且調(diào)用的結(jié)果相同的話,我建議你不妨試試,特別是當(dāng)這個函數(shù)運行起來比較慢的時候。
下面我們實現(xiàn)對一個執(zhí)行起來很慢的函數(shù)slowFunction()的緩沖調(diào)用。
<?php require_once 'Cache/Function.php';
$cacheDir = './pear_cache/'; $cache = new Cache_Function('file',array('cache_dir' => $cacheDir)); $arr = array('蘋果', '梨','西瓜'); $cache->call('slowFunction', $arr); echo '<BR>';
$arr = array('蘋果', '梨','西瓜'); slowFunction($arr);
function slowFunction($arr = null) { echo '一個執(zhí)行起來很慢的函數(shù) :( <br>'; echo '當(dāng)前時間是 ' . date('M-d-Y H:i:s A', time()) . '<br>'; foreach ($arr as $fruit) { echo '我吃了一個 $fruit <br>'; } ) ?>
以下是示例的腳本執(zhí)行結(jié)果:
一個執(zhí)行起來很慢的函數(shù)
當(dāng)前時間是 Jul-28-2004 17:15:57 PM我吃了一個 蘋果 我吃了一個 梨 我吃了一個 西瓜
一個執(zhí)行起來很慢的函數(shù) :( 當(dāng)前時間是 Jul-28-2004 17:17:55 PM我吃了一個 蘋果 我吃了一個 梨 我吃了一個 西瓜
代碼中,Cache/Function.php類用來執(zhí)行函數(shù)緩沖功能。$cache變量是一個Cache_Function對象,使用基于文件的函數(shù)緩存,存入$cacheDir目錄。要緩存一個函數(shù)調(diào),Cache_Function對象$cache的call()方法要像這樣使用:$cache->call(‘slowFunction’, $arr);
這里,slowFunction()函數(shù)被調(diào)用,參數(shù)為一個數(shù)組$arr,這個函數(shù)被緩存在$cacheDir目錄下的一個文件里。任何在此之后的對這個函數(shù)的調(diào)用,將會由$cache->call()返回該函數(shù)執(zhí)行的結(jié)果。 函數(shù)緩存和使用方法和內(nèi)容緩存很相似,不再多說,具體請查看PEAR手冊。
