簡單的資料緩衝技術
近來做了一陣子程式效能的最佳化工作,有個比較有意思的想法,想提出來和大家交流一下。
Cache是“以空間換時間”策略的典型應用模式,是提高系統效能的一種重要方法。緩衝的使用在大訪問量的情況下能夠極大的減少對資料庫操作的次數,明顯降低系統負荷提高系統效能。相比頁面的緩衝,結果集是一種“未經處理資料”不包含格式資訊,資料量相對較小,而且可以再進行格式化,所以顯得相當靈活。由於PHP是“一邊編譯一邊執行”的指令碼語言,某種程度上也提供了一種相當方便的結果集緩衝使用方法——通過動態include相應的資料定義程式碼片段的方式使用緩衝。如果在“RamDisk”上建緩衝的話,效率應該還可以得到進一步的提升。以下是一小段範例程式碼,供參考。
<?
// load data with cache
function load_data($id,$cache_lifetime) {
// the return data
$data = array();
// make cache filename
$cache_filename = ‘cache_‘.$id.‘.php‘;
// check cache file‘s last modify time
$cache_filetime = filemtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** the cache is not expire
include($cache_filename);
} else {
//** the cache is expired
// load data from database
// ...
while ($dbo->nextRecord()) {
// $data[] = ...
}
// format the data as a php file
$data_cache = "<?\r\n";
while (list($key, $val) = each($data)) {
$data_cache .= "\$data[‘$key‘]=array(‘";
$data_cache .= "‘NAME‘=>\"".qoute($val[‘NAME‘])."\","
$data_cache .= "‘VALUE‘=>\"".qoute($val[‘VALUE‘])."\""
$data_cache .= ");\r\n";
}
$data_cache = "?>\r\n";
// save the data to the cache file
if ($fd = fopen($cache_filename,‘w+‘)) {
fputs($fd,$data_cache);
fclose($fd);
}
}
return $data;
}
?>
適用情況:
1.資料相對比較穩定,主要是讀取操作。
2.檔案操作要比資料庫操作快。
3.複雜資料訪問,大資料量訪問,密集資料訪問,系統資料庫負載極重。
4.Web/DB分離結構或者多Web單DB結構。
未經證實的問題:
1.並發訪問時對檔案的讀寫是否會引起鎖定問題。
2.涉及到的資料檔案太多時,效能如何。
擴充思路:
1.產生JavaScript資料定義代碼,在用戶端調用。
2.還未想到……
望共同探討。
緩衝
如果你想要讓自己龐大的PHP應用有更好的效能表現,採用緩衝也是一種很好的方法。現在已經有許多緩衝方案可供選擇,其中包括:Zend Cache,APC,和Afterburner Cache。
所有這些產品都屬於“緩衝模組”。當第一次出現對.php檔案的請求時,它們會在Web伺服器記憶體中儲存PHP的中間代碼,此後就用“經過編譯”的版本響應後繼的請求。這種方法確實能夠改善應用的效能,因為它使得磁碟訪問量減低到了最少的程度(代碼已經讀取和解析),代碼直接在記憶體中運行使得伺服器響應請求的速度大大提高。當然,緩衝模組還會監視PHP源檔案的變化,必要時重新快取頁面面,從而防止了使用者得到的頁面仍舊由過時的PHP代碼產生。由於緩衝模組能夠明顯地降低伺服器的負載、提高PHP應用的響應效率,因此它們非常適合於負載較大的網站使用。
如何選擇這些緩衝產品
Zend Cache是Zend Technologies公司的商業軟體,而Zend Technologies就是前面提到的那個為我們提供PHP引擎和免費Zend Optimizer的公司。Zend Cache確實是名不虛傳!對於大型的PHP頁面,你可以感覺到第一次運行之後速度就會有所提高,而且伺服器也會有更多的可用資源。遺憾的是這個產品並不免費,不過在有些情形下它仍舊是物超所值。
Afterburner Cache是來自Bware Technologies的免費緩衝模組,當前這個產品還是Beta版。Afterburner Cache的做法看起來與Zend Cache差不多,但它對效能的改善程度(還)不能與Zend Cache相比,而且它還不能與Zend Optimizer一起工作。
APC是Alternative PHP Cache的縮寫,它是來自Community Connect的又一個免費緩衝模組。這個產品已經具有足夠的穩定性供正式場合使用,而且它看起來也能在很大程度上提高響應請求的速度。