您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關PHP如何實現緩存技術的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
PHP,一門最近幾年興起的Web設計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發展,PHP相比傳統的ASP網站,在速度上有絕對的優勢,想mssql轉6萬條數據PHP如需要40秒,ASP不下2分鐘.但是,由于網站的數據越來越多,我們渴求能更快速的調用數據,不必要每次都從數據庫掉,我們可以從其他的地方,比方一個文件,或者某個內存地址,這就是PHP的緩存技術,也就是Cache技術。
分析深入
一般來說,緩存的目的是把數據放在一個地方讓訪問的更快點,毫無疑問,內存是最快的,但是,幾百M的數據能往內存放么?這不現實,當然,有的時候臨時放如服務器緩存,如ob_start()這個緩存頁面開啟的話在發送文件頭之前頁面內容都被緩存在內存中,知道等頁面輸出自動清楚或者等待ob_get_contents的返回,或者被ob_end_clean顯示的清除,這在靜態頁面的生成中能很好的利用,在模板中能得到很好的體現。
另外,在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屬性設置為這個文件夾名稱,我們的所有緩存文件都是在這個文件夾下面的.
function __destruct(){ echo 'Cache class bye.'; }
這是class類的析構函數,為了演示,我們輸出一個字符串表示我們釋放cache類資源成功.
function warn($errorstring){ echo "<b><font color='red'>發生錯誤:<pre>".$errorstring."</pre></font></b>"; }
這個方法輸出錯誤信息:
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; }
這個方法返回當前url的信息,這是我看國外很多人的cms系統這樣做,主要是緩存x.PHP?page=1,x.PHP?page=2,等這種文件的,這里列出是為了擴展的這個cache類功能的。
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; }
cache_page方法分別傳入的是緩存的文件名稱和數據,這是把數據寫到文件里的方法,先用fopen打開文件,然后調用句柄鎖定這個文件,然后用fwrite寫入文件,***釋放這個句柄,任何一步發生錯誤將拋出錯誤. 您可能看到這個注釋:
寫入字節流,serialize寫入其他格式,順便一提的是如果我們要把一個數組,(可以從MySQL數據庫里面select查詢除了的結果)用serialize函數寫入,用unserialize讀取到原來的類型。
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; }
這是由文件名稱讀取緩存的方法,直接打開文件,讀取全部,如果文件不存在的或者無法讀取的話返回false,當然,你感到不人性的話,可以重新生成緩存.
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; }
這個函數是我們調用的方法,可以寫成接口的方法,由傳入參數判斷文件存在不,文件***修改時間+expireTime的時間是不是過了當前時間(大于的話說明沒有過期),如果文件不存在或者已經過期,重新加載原始數據,這里,為了簡單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數據庫的數據.(注釋2)
感謝各位的閱讀!關于“PHP如何實現緩存技術”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。