PHP,一門最近幾年興起的web設計腳本語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp網站,在速度上有絕對的優勢,想mssql轉6萬條數據php如需要40秒,asp不下2分鐘.但是,由於網站的數據越來越多,我們渴求能更快速的調用數據,不必要每次都從數據庫掉,我們可以從其他的地方,比方一個文件,或者某個內存地址,這就是php的緩存技術,也就是Cache技術.
一般來說,緩存的目的是把數據放在一個地方讓訪問的更快點,毫無疑問,內存是最快的,但是,幾百M的數據能往內存放麼?這不現實,當然,有的時候臨時放如服務器緩存,如ob_start()這個緩存頁面開啟的話在發送文件頭之前頁面內容都被緩存在內存中,知道等頁面輸出自動清楚或者等待ob_get_contents的返回,[或者被ob_end_clean顯示的清除,這在靜態頁面的生成中能很好的利用,在模板中能得到很好的體現,我的這篇文章深入的討論了:
談PHP生成靜態頁面,這是一種方式,但這是臨時性的,不是解決我們問題的好方法.
另外,在asp中有一對象application,可以保存公用的參數,這也算點緩存,但在php,我至今沒看到開發者產出這種對象,的確,沒必要.asp.net的頁面緩存技術就用的是viewstate,而cache就是文件關聯,(不一定准確),文件被修改,更新緩存,文件沒被修改而且不超時(注釋1),就讀取緩存,返回結果,就是這個思路,看看這個源碼:
<?php
class cache{
/*
Class Name: cache
Description: control to cache data,$cache_out_time is a array to save cache date time out.
Version: 1.0
Author: 老農 cjjer
Last modify:2006-2-26
Author URL: http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//緩存的時間是 60 秒
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn(緩存文件不存在而且不能創建,需要手動創建.);
return false;
}
}
$this->cache_dir = $cache_dirname;
}
function __destruct(){
echo Cache class bye.;
}
function get_url() {
if (!isset($_SERVER[REQUEST_URI])) {
$url = $_SERVER[REQUEST_URI];
}else{
$url = $_SERVER[SCRIPT_NAME];
$url .= (!empty($_SERVER[QUERY_STRING])) ? ? . $_SERVER[QUERY_STRING] : ;
}
return $url;
}
function warn($errorstring){
echo "<b><font color=red>發生錯誤:<pre>".$errorstring."</pre></font></b>";
}
function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,w)){
$this->warns(無法打開緩存文件.);//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
$this->warns(無法鎖定緩存文件.);//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//寫入字節流,serialize寫入其他格式
$this->warns(無法寫入緩存文件.);//trigger_error
return false;
}
flock($fso,LOCK_UN);//釋放鎖定
fclose($fso);
return true;
}
function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn(無法讀取緩存文件.);//trigger_error
return false;
}
echo 讀取緩存文件:.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, r);
$data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;
}
function readData($cacheFile=default_cache.txt){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="from here wo can get it from mysql database,update time is <b>".date(l dS of F Y h:i:s A)."</b>,過期時間是:".date(l dS of F Y h:i:s A,time()+$this->expireTime)."----------";
$this->cache_page($cacheFile,$data);
}
return $data;
}
}
?>
下面我打斷這個代碼逐行解釋.
三:程序透析這個緩存類(類沒什麼好怕的.請繼續看)名稱是cache,有2個屬性:
private $cache_dir;
private $expireTime=180;
$cache_dir是緩存文件所放的相對網站目錄的父目錄, $expireTime(
注釋一)是我們緩存的數據過期的時間,主要是這個思路:
當數據或者文件被加載的時候,先判斷緩存文件存在不,返回false ,文件最後修改時間和緩存的時間和比當前時間大不,大的話說明緩存還沒到期,小的話返回false,當返回false的時候,讀取原始數據,寫入緩存文件中,返回數據.,
接著看程序:
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn(緩存文件不存在而且不能創建,需要手動創建.);
return false;
}
}
$this->cache_dir = $cache_dirname;
}
當類第一次被實例的時候構造默認函數帶參數緩存文件名稱,如文件不存在,創建一個有編輯權限的文件夾,創建失敗的時候拋出異常.然後把cache類的 $cache_dir屬性設置為這個文件夾名稱,我們的所有緩存文件都是在