內容快取輸出PEAR cache
接下來我們開始探索更常用的快取技術,這也是本文的重點。首先我們使用PEAR中的cache包。 PEAR可以將內容快取於文件,資料庫或記憶體中,我們以文件為例。
下面是一個沒有使用快取的PHP小程式:
pear_content_cache1.php
<?php
echo "這是內容。<P>";
echo "目前時間是" . date('MdY 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('MdY 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物件的geneIDrate( )方法透過提供一個資訊數組(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('MdY 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手冊。