推薦:利用PHP V5開發(fā)多任務(wù)應(yīng)用程序許多 PHP 開發(fā)人員認(rèn)為,由于標(biāo)準(zhǔn)的 PHP 缺少線程功能,因此實際 PHP 應(yīng)用程序不可能執(zhí)行多任務(wù)處理。例如,如果應(yīng)用程序需要其他 Web 站點的信息,那么在遠(yuǎn)程檢索完成之前它都必須停止。這是錯
PHP,一門最近幾年興起的web設(shè)計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發(fā)展,php相比傳統(tǒng)的asp網(wǎng)站,在速度上有絕對的優(yōu)勢,想mssql轉(zhuǎn)6萬條數(shù)據(jù)php如需要40秒,asp不下2分鐘.但是,由于網(wǎng)站的數(shù)據(jù)越來越多,我們渴求能更快速的調(diào)用數(shù)據(jù),不必要每次都從數(shù)據(jù)庫掉,我們可以從其他的地方,比方一個文件,或者某個內(nèi)存地址,這就是php的緩存技術(shù),也就是Cache技術(shù).
一般來說,緩存的目的是把數(shù)據(jù)放在一個地方讓訪問的更快點,毫無疑問,內(nèi)存是最快的,但是,幾百M的數(shù)據(jù)能往內(nèi)存放么?這不現(xiàn)實,當(dāng)然,有的時候臨時放如服務(wù)器緩存,如ob_start()這個緩存頁面開啟的話在發(fā)送文件頭之前頁面內(nèi)容都被緩存在內(nèi)存中,知道等頁面輸出自動清楚或者等待ob_get_contents的返回,[或者被ob_end_clean顯示的清除,這在靜態(tài)頁面的生成中能很好的利用,在模板中能得到很好的體現(xiàn),我的這篇文章深入的討論了:
談PHP生成靜態(tài)頁面,這是一種方式,但這是臨時性的,不是解決我們問題的好方法.
另外,在asp中有一對象application,可以保存公用的參數(shù),這也算點緩存,但在php,我至今沒看到開發(fā)者產(chǎn)出這種對象,的確,沒必要.asp.net的頁面緩存技術(shù)就用的是viewstate,而cache就是文件關(guān)聯(lián),(不一定準(zhǔn)確),文件被修改,更新緩存,文件沒被修改而且不超時(注釋1),就讀取緩存,返回結(jié)果,就是這個思路,看看這個源碼:
<?php classcache{ /* ClassName:cache Description:controltocachedata,$cache_out_timeisaarraytosavecachedatetimeout. Version:1.0 Author:老農(nóng)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('緩存文件不存在而且不能創(chuàng)建,需要手動創(chuàng)建.'); 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'>發(fā)生錯誤:<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)){//寫入字節(jié)流,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; }
} ?>
|
分享:詳細(xì)解析 PHP 向 MySQL 發(fā)送數(shù)據(jù)過程下面的一段代碼是一個很簡單的 HTML 表單:
<html>
<body>
<formaction=submitform.php3method=GET>
姓:<inputtype=textname=fir