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 classcache{ /* ClassName:cache Description:controltocachedata,$cache_out_timeisaarraytosavecachedatetimeout. Version:1.0 Author:老農cjjer Lastmodify:2006-2-26 AuthorURL: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('緩存文件不存在而且不能創建,需要手動創建.'); returnfalse; } } $this->cache_dir=$cache_dirname; } function__destruct(){ echo'Cacheclassbye.'; } functionget_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; } functionwarn($errorstring){ echo"<b><fontcolor='red'>發生錯誤:<pre>".$errorstring."</pre></font></b>"; } functioncache_page($pageurl,$pagedata){ if(!$fso=fopen($pageurl,'w')){ $this->warns('無法打開緩存文件.');//trigger_error returnfalse; } if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定 $this->warns('無法鎖定緩存文件.');//trigger_error returnfalse; } if(!fwrite($fso,$pagedata)){//寫入字節流,serialize寫入其他格式 $this->warns('無法寫入緩存文件.');//trigger_error returnfalse; } flock($fso,LOCK_UN);//釋放鎖定 fclose($fso); returntrue; } functiondisplay_cache($cacheFile){ if(!file_exists($cacheFile)){ $this->warn('無法讀取緩存文件.');//trigger_error returnfalse; } echo'讀取緩存文件:'.$cacheFile; //returnunserialize(file_get_contents($cacheFile)); $fso=fopen($cacheFile,'r'); $data=fread($fso,filesize($cacheFile)); fclose($fso); return$data; } functionreadData($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="fromherewocangetitfrommysqldatabase,updatetimeis<b>".date('ldSofFYh:i:sA')."</b>,過期時間是:".date('ldSofFYh:i:sA',time() $this->expireTime)."----------"; $this->cache_page($cacheFile,$data); } return$data; } } ?> |