採用PEAR 來緩衝PHP 程序
PHP 世界中緩衝是一個熱門的話題,因為PHP 產生的動態頁面,每次使用者要求都需要重新計算,無論請求的結果是否一樣,同時,PHP 每次都會編譯一次腳本。這樣的超負荷運作對一個流量很高的網站來說肯定難以忍受。幸運的是, Web 的結果可以緩衝,而不需要重新運行和編譯腳本,商品化的產品像ZendCache 或開源的Alternate PHP Cache都提供了把PHP 腳本編譯為字節程式碼並緩衝的辦法。
PEAR 的緩衝包提供了緩衝動態內容,資料庫查詢和PHP 函數呼叫的框架。
就像Perl 有CPAN, TeX 有CTAN,PHP 也有自己的中心資源庫,存放類,庫和模組。這個庫稱為PEAR(PHP Extension and Add-On Repository)。
本文假設你已經安裝了PEAR 環境,如果沒有的話,可以去PHP 網站下載。 PEAR 的緩衝包包含一個總體的緩衝類別和幾個特別的子類別。緩衝類別使用容器類別來存貯和管理緩衝資料。
下面是PEAR 緩衝目前所包含的容器,以及各自的參數:
file — file 容器在檔案系統中儲存了緩衝的數據,是最快的容器。
cache_dir — 這是容器儲存檔案的目錄。
filename_prefix — 緩衝檔案的前綴,例如:”cache_」。
shm — shm 容器把緩衝資料放入共享內存,基準測試顯示,目前的實現下,這個容器的速度要比文件容器慢。
shm_key — 共享記憶體使用的鍵值。
shm_perm — 使用共享記憶體資料段的權限。
shm_size — 分配共享記憶體的大小。
sem_key — 信號燈的鍵值。
sem_perm — 信號燈的權限。
db — PEAR 的資料庫抽象層。
dsn — 資料庫連接的DSN 。可以參考PEAR 的DB 文件。
cache_table — 表格的名稱。
phplib — phplib 容器使用資料庫抽象層儲存緩衝。
db_class
db_file
db_path
local_file
local_path
ext/dbx — PHP 的資料庫抽象層擴展,如果像把緩衝存入資料庫,可以採用這個容器。
module
host
db
username
password
cache_table
persistent
使用PEAR Cache 所得到的效能提升取決於你所選擇的緩衝容器,例如,把資料庫的結果再次存入資料庫緩衝就顯得毫無意義。
PEAR Cache 的函數緩衝模組能把任何函數或方法的結果緩衝,不論是PHP 的內建函數或是使用者自訂函數,他缺省採用檔案容器,把緩衝資料放入到一個叫做function_cache 的目錄。
Cache_Function 類別的建構器可以有三個可選的參數:
$container :緩衝容器的名字。
$container_options :緩衝容器的陣列參數。
$expires:緩衝物件過期的時間(秒數)。
普通的函式呼叫採用Cache_Function 類別的call() 方法時,就能觸發緩衝。呼叫call() 很容易,的一個參數是函數的名字,然後是函數的參數,第二個參數是要呼叫函數中的第一個,依此類推,我們來看範例:
範例1 緩衝函數和方法的調用
// 呼叫PEAR Cache 的函數緩衝。
require_once 'Cache/Function.php';
// 定義一些類別和函數。
class foo {
function bar($test) {
echo "foo::bar($test)
";
}
}
class bar {
function foobar($object) {
echo '$'.$object.'->foobar('.$object.')
';
}
}
$bar = new bar;
function foobar() {
echo 'foobar()';
}
// 取得Cache_Function 對象
$cache = new Cache_Function();
// 對foo 類別的靜態函數bar() 作緩衝(foo::bar())。
$cache->call('foo::bar', 'test');
// $bar->foobar()
$cache->call('bar->foobar', 'bar');
$cache->call('foobar');
?>
下面我們採用Cache_Output 來把輸出作緩衝:
範例2 緩衝腳本的輸出
// 載入PEAR Cache 的輸出緩衝
require_once 'Cache/Output.php';
$cache = new Cache_Output('file', array('cache_dir' => '.') );
// 計算要緩衝頁面的標記,我們假定頁面的緩衝取決於
// URL, HTTP GET 和POST 變數以及cookies。
$cache_id = $cache->generateID(
array('url' => $REQUEST_URI, '
post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );
// 查詢緩衝
if ($content = $cache->start($cache_id)) {
// 緩衝命中
echo $content;
die();
}
// 緩衝丟失
// -- 在這裡插入內容產生程式碼--
// 把頁面存入緩衝
echo $cache->end();
?>
利用Cache_Output 類,很容易把一個動態的資料庫驅動的網站應用程式轉化為靜態,從而極大的提升網站的效能。越來越多的網站採用GZIP 壓縮HTML 內容,這減少了伺服器的頻寬消耗,對於使用Modem 上網的用戶來說也能受益不少。
Cache_OutputCompression 擴充了Cache_Output 類別的功能,他把GZIP 壓縮的HTML 內容進行緩衝,從而節省了CPU 壓縮的時間