如果後台應用接收到浏覽器端的查詢請求後,每次都與數據庫連接讀取數據,勢必增加數據庫的負擔。而往往有大量的請求是重復的,我們可以把這些重復的信息采用緩存技術保存下來,重復使用,這樣,在某些情況下可以大大提高程序的性能。
1,緩存函數
cache_write函數接受$string參數,寫到$file文件中。注意var_export函數,作用是:
此函數返回關於傳遞給該函數的變量的結構信息,它和 var_dump() 類似,不同的是其返回的表示是合法的 PHP 代碼。您可以通過將函數的第二個參數設置為 TRUE,從而返回變量的表示。
這些參數可以是數組或常量,而這些數組或常量通常為從數據庫中取出的記錄,或非序列化(unserialize)對象後得到的數據。這些都可以緩存到本地的文本文件中。
cache_write函數很簡單,需要讀取數據時,先判斷緩存是否存在,存在的話就不去連接數據庫取數據,而是直接讀出緩存的文本文件,直接產生了數組或常量等類型的數據,可以直接使用。
<?PHP
//文件名func.inc.PHP
define("CACHEDIR", "./"); //定義緩存文件夾
function cache_write($file, $string, $type = 'array'){
if(is_array($string)){
$type = strtolower($type);
if($type == 'array'){
$string = "<?PHP\n return ".var_export($string,TRUE).";\n?>";
}elseif($type == 'constant'){
$data='';
foreach($string as $key => $value)
$data .= "define('".strtoupper($key)."','".addslashes($value)."');\n";
$string = "<?PHP\n".$data."\n?>";
}
}
$strlen = file_put_contents(CACHEDIR.$file, $string);
chmod(CACHEDIR.$file, 0777);
return $strlen;
}
function cache_read($file) {
$cachefile = CACHEDIR.$file;
if(!file_exists($cachefile))
return array();
return include $cachefile;
}
function cache_delete($file)
{
return @unlink(CACHEDIR.$file);
}
if(!function_exists('file_put_contents'))
{
define('FILE_APPEND', 8);
function file_put_contents($file, $string, $append = ''){
$mode = $append == '' ? 'wb' : 'ab';
$fp = @fopen($file, $mode) or exit("Can not open file $file !");
flock($fp, LOCK_EX);
$stringlen = @fwrite($fp, $string);
flock($fp, LOCK_UN);
@fclose($fp);
return $stringlen;
}
}
?>
2,寫緩存和讀取的示例
<?PHP
//寫緩存
include "func.inc.PHP";
$arr = array (1, 2, array ("a", "b", "c"));
cache_write('test.cache.php', $arr); //緩存文件 test.cache.PHP
?>
<?PHP
//讀緩存
include "func.inc.PHP";
$var = cache_read('test.cache.PHP');
print_r($new_var);
print_r($var);
foreach ($var as $k=>$v){
echo '<br>' . $k . '=' . $v ;
}
?>
3,性能分析
緩存之所以能提高性能,是通過本地磁盤空間換網絡存取速度和數據庫服務器存取時間的結果。
a = 本機讀寫時間
b = 本機占用空間
c = 網絡傳輸時間
d = 數據庫服務器磁盤時間
可以估算到,如果數據庫與應用程序存在於一台機器時,主要是 a 與 d 的比較,效果可能並不明顯,甚至還要糟一點。因為數據庫系統針對磁盤存取經過了精心優化,是操作系統對文件的普通讀寫無法相比的。
如果本機的磁盤存取效率不佳,有時從局域網的數據庫上取得數據,可能比從本機的緩存取數據還快,這種情況比較少見。而隨著請求數量的大量增加,緩存的效果就會明顯起來。