萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP程序加速探索之緩存輸出

PHP程序加速探索之緩存輸出

  內容緩存輸出 PEAR cache

  接下來我們開始探索更常用的緩存技術,這也是本文的重點部份。首先我們使用PEAR中的cache包。PEAR可以將內容緩存於文件,數據庫或者內存中,我們以文件為例。

  下面是一個沒有使用緩存的PHP小程序:

  pear_content_cache1.php

<?php 
echo "這是內容。<P>"; 
echo "當前時間是" . date('M-d-Y H:i:s A', time()) . "<BR>"; 
?>

  上面這個程序非常簡單,現在我們為其加上緩存。

  pear_content_cache2.php

<?php 
require_once 'Cache/Output.php';

 //設置緩存目錄,必須是可寫的 
$cacheDir = './pear_cache'; 
$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));

 //如果nocache變量為空,使用緩存中的內容 
//如果想獲得最新的內容,就要賦值給nocache變量 
if (empty($_REQUEST['nocache'])) 

// 建立一個獨一的cache標識 
// 請求+Cookie信息 
$cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS)); 

else 

//想獲得最新的內容,ID為空 
$cache_id = null; 
}

 //看cache ID對應的緩存內容是否可用 
if ($content = $cache->start($cache_id)) 

//緩存已存在,直接輸出,並結束腳本 
echo $content; 
exit(); 
}

 // 緩存中不存在該內容,生成新內容並寫入緩存 
echo "這是內容。<P>"; 
echo "當前時間是" . date('M-d-Y H:i:s A', time()) . "<BR>";

 // 把內容寫入緩存 
echo $cache->end(); 
?>

  分別刷新這兩個文件,你會發現pear_content_cache1.php中的“當前時間是”這一行中的時間是隨著刷新而變化的,而pear_content_cache2.php中的這一行則不變。這是由於pear_content_cache2.php使用了緩存,將用戶請求的內容存入靜態文件中。當用戶再次請求時,它直接從文件中輸出,而不需要用程序動態生成內容。

  對於pear_content_cache2.php,如果用戶想要讀取最新的信息,而不是緩存中成舊的信息。那麼可以用http://…/pear_content_cache2.php?nocache=1 來訪問,這將禁用緩存功能。刷新一下看看,你將發現時間會隨之變化。

  總結一下PEAR內容緩存類的使用:

  1.包含PEAR包 要注意設對路徑。

2.包含Output.php中的cache類

require_once 'Cache/Output.php';

  3.設置緩存目錄

$cacheDir = './pear_cache';

  確認這個目錄是可寫的。Cache數據將會寫入這個目錄的子目錄中。

  4.建立一個輸出緩存對象

$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));

  第一個參數表示我們使用基於“文件”方式的緩存,第二個參數是一個與緩存目錄相關聯的數組。

  5.產生一個唯一的cache ID

$cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));

  這裡$cache對象的generateID()方法通過提供一個信息數組(URL, HTTP POST data, 和 HTTP cookie)來獨一無二地標識這個請求,與其它請求區分開來。

  6.增加一個邏輯判斷語句看是否對應於cacheID的緩存數據是否已經存在,如果存在,獲取數據並結束腳本。

if ($content = $cache->start($cache_id)) 

echo $content; 
exit(); 
}

  7. 將產生內容的代碼放在以上邏輯語句之後,並結束使用cache對象。

echo $cache->end();

  函數緩存輸出 PEAR cache

  PEAR除了可以對輸出的內容進行緩存處理外,還可以將對某個函數的調用結果緩存起來。這是個很有趣的功能,如果你的程序要頻繁使用到某個函數,而且調用的結果相同的話,我建議你不妨試試,特別是當這個函數運行起來比較慢的時候。

  下面我們實現對一個執行起來很慢的函數slowFunction()的緩沖調用。

<?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 "一個執行起來很慢的函數 :( <br>"; 
echo "當前時間是 " . date('M-d-Y H:i:s A', time()) . '<br>'; 
foreach ($arr as $fruit) 

echo "我吃了一個 $fruit <br>"; 


?>

  以下是示例的腳本執行結果:

  一個執行起來很慢的函數

  當前時間是 Jul-28-2004 17:15:57 PM
我吃了一個 蘋果 
我吃了一個 梨 
我吃了一個 西瓜

  一個執行起來很慢的函數 :( 
當前時間是 Jul-28-2004 17:17:55 PM
我吃了一個 蘋果 
我吃了一個 梨 
我吃了一個 西瓜

  代碼中,Cache/Function.php類用來執行函數緩沖功能。$cache變量是一個Cache_Function對象,使用基於文件的函數緩存,存入$cacheDir目錄。要緩存一個函數調,Cache_Function對象$cache的call()方法要像這樣使用:$cache->call(‘slowFunction’, $arr);

  這裡,slowFunction()函數被調用,參數為一個數組$arr,這個函數被緩存在$cacheDir目錄下的一個文件裡。任何在此之後的對這個函數的調用,將會由$cache->call()返回該函數執行的結果。 函數緩存和使用方法和內容緩存很相似,不再多說,具體請查看PEAR手冊。

copyright © 萬盛學電腦網 all rights reserved