一、引論
php,一門最近幾年興起的web設計指令碼語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp**,在速度上有絕對的優勢,想mssql轉6萬條資料php如需要40秒,asp不下2分鐘.但是,由於**的資料越來越多,我們渴求能更快速的呼叫資料,不必要每次都從資料庫掉,我們可以從其他的地方,比方乙個檔案,或者某個記憶體位址,這就是php的快取技術,也就是cache技術.
二、分析深入
一般來說,快取的目的是把資料放在乙個地方讓訪問的更快點,毫無疑問,記憶體是最快的,但是,幾百m的資料能往內存放麼?這不現實,當然,有的時候臨時放如伺服器快取,如ob_start()這個快取頁面開啟的話在傳送檔案頭之前頁面內容都被快取在記憶體中,知道等頁面輸出自動清楚或者等待 ob_get_contents的返回,或者被ob_end_clean顯示的清除,這在靜態頁面的生成中能很好的利用,在模板中能得到很好的體現,我的這篇文章深入的討論了:談php生成靜態頁面,這是一種方式,但這是臨時性的,不是解決我們問題的好方法.
<?php
class cache
}$this->cache_dir = $cache_dirname;
}function __destruct()
function get_url() else
return $url;
}function warn($errorstring)
function cache_page($pageurl,$pagedata)
if(!flock($fso,lock_ex))
if(!fwrite($fso,$pagedata))
flock($fso,lock_un);//釋放鎖定
fclose($fso);
return true;
}function display_cache($cachefile)
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')else
return $data;}}
?>
下面我打斷這個**逐行解釋.
三、程式透析
這個快取類(類沒什麼好怕的.請繼續看)名稱是cache,有2個屬性:
private $cache_dir;
private $expiretime=180;
$cache_dir是快取檔案所放的相對**目錄的父目錄, $expiretime(注釋一)是我們快取的資料過期的時間,主要是這個思路:
當資料或者檔案被載入的時候,先判斷快取檔案存在不,返回false ,檔案最後修改時間和快取的時間和比當前時間大不,大的話說明快取還沒到期,小的話返回false,當返回false的時候,讀取原始資料,寫入快取檔案中,返回資料.
接著看程式:
function __construct($cache_dirname)
}$this->cache_dir = $cache_dirname;
}當類第一次被例項的時候構造預設函式帶引數快取檔名稱,如檔案不存在,建立乙個有編輯許可權的資料夾,建立失敗的時候丟擲異常.然後把cache類的 $cache_dir屬性設定為這個資料夾名稱,我們的所有快取檔案都是在這個資料夾下面的.
function __destruct()
這是class類的析構函式,為了演示,我們輸出乙個字串表示我們釋放cache類資源成功.
function warn($errorstring)
這個方法輸出錯誤資訊.
function get_url() else
return $url;
}這個方法返回當前url的資訊,這是我看國外很多人的cms系統這樣做,主要是快取x.php?page=1,x.php?page=2,等這種檔案的,這裡列出是為了擴充套件的這個cache類功能的.
function cache_page($pageurl,$pagedata)
if(!flock($fso,lock_ex))
if(!fwrite($fso,$pagedata))
flock($fso,lock_un);//釋放鎖定
fclose($fso);
return true;
}cache_page方法分別傳入的是快取的檔名稱和資料,這是把資料寫到檔案裡的方法,先用fopen開啟檔案,然後呼叫控制代碼鎖定這個檔案,然後用fwrite寫入檔案,最後釋放這個控制代碼,任何一步發生錯誤將丟擲錯誤. 您可能看到這個注釋:
寫入位元組流,serialize寫入其他格式
順便一提的是如果我們要把乙個陣列,(可以從mysql資料庫裡面select查詢除了的結果)用serialize函式寫入,用unserialize讀取到原來的型別.
function display_cache($cachefile)
echo '讀取快取檔案:'.$cachefile;
//return unserialize(file_get_contents($cachefile));
$fso = fopen($cachefile, 'r');
$data = fread($fso, filesize($cachefile));
fclose($fso);
return $data;
}這是由檔名稱讀取快取的方法,直接開啟檔案,讀取全部,如果檔案不存在的或者無法讀取的話返回false,當然,你感到不人性的話,可以重新生成快取.
function readdata($cachefile='default_cache.txt')else
return $data;
}四、補充說明,結語
注釋一:這個快取的時間您可以自己調,可以根據時間情況讀取陣列,xml,快取等,請按照您的方便,值得一提的是快取的時間(也就是快取的key)也用快取控制,.這在cms系統中被廣泛使用,他們把要更新的key放在快取中,非常容易控制全戰.
注釋二:php5開始支援類繼承,這是讓人興奮的,把**全域性休息寫在乙個配置的類裡面,再寫與資料層互動的類(如與mysql互動的類),我們的這個cache類繼承資料互動的類,可以非常容易的讀取資料庫,這是外話,此處不再展開,有時間和大家詳談.
特別說明,這個類檔案針對的php5以上版本,其他版本的請不要使用類.
php快取技術詳談
php快取技術詳談 一 引論 php,一門最近幾年興起的web設計指令碼語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp 在速度上有絕對的優勢,想mssql轉6萬條資料php如需要40秒,asp不下2分鐘.但是,由於 的資料越來越多,我們渴求能更快速的呼叫資料,不必要每次...
快取技術詳談 php
一 引論 php,一門最近幾年興起的web設計指令碼語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp 在速度上有絕對的優勢,想mssql轉6萬條資料php如需要40秒,asp不下2分鐘.但是,由於 的資料越來越多,我們渴求能更快速的呼叫資料,不必要每次都從資料庫掉,我們可...
快取技術詳談
一 引論 php,一門最近幾年興起的web設計指令碼語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp 在速度上有絕對的優勢,想mssql轉6萬條資料php如需要40秒,asp不下2分鐘.但是,由於 的資料越來越多,我們渴求能更快速的呼叫資料,不必要每次都從資料庫掉,我們可...