日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
深入探討PHP緩存技術

PHP,一門最近幾年興起的Web設計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發(fā)展,PHP相比傳統(tǒng)的ASP網站,在速度上有絕對的優(yōu)勢,想mssql轉6萬條數(shù)據PHP如需要40秒,ASP不下2分鐘.但是,由于網站的數(shù)據越來越多,我們渴求能更快速的調用數(shù)據,不必要每次都從數(shù)據庫掉,我們可以從其他的地方,比方一個文件,或者某個內存地址,這就是PHP的緩存技術,也就是Cache技術。

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、網站制作、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的滿洲網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

分析深入

一般來說,緩存的目的是把數(shù)據放在一個地方讓訪問的更快點,毫無疑問,內存是最快的,但是,幾百M的數(shù)據能往內存放么?這不現(xiàn)實,當然,有的時候臨時放如服務器緩存,如ob_start()這個緩存頁面開啟的話在發(fā)送文件頭之前頁面內容都被緩存在內存中,知道等頁面輸出自動清楚或者等待ob_get_contents的返回,或者被ob_end_clean顯示的清除,這在靜態(tài)頁面的生成中能很好的利用,在模板中能得到很好的體現(xiàn)。

另外,在ASP中有一對象application,可以保存公用的參數(shù),這也算點緩存,但在PHP,我至今沒看到開發(fā)者產出這種對象,的確,沒必要.ASP.NET的頁面緩存技術就用的是viewstate,而cache就是文件關聯(lián),(不一定準確),文件被修改,更新緩存,文件沒被修改而且不超時(注釋1),就讀取緩存,返回結果,就是這個思路,看看這個源碼:

 
 
 
  1. class cache{
  2. /*
  3. Class Name: cache
  4. Description: control to cache data,$cache_out_time is a array to save cache date time out.
  5. Version: 1.0
  6. Author: 老農 cjjer
  7. Last modify:2006-2-26
  8. Author URL: http://www.cjjer.com
  9. */
  10. private $cache_dir;
  11. private $expireTime=180;//緩存的時間是 60 秒
  12. function __construct($cache_dirname){
  13.  if(!@is_dir($cache_dirname)){
  14.   if(!@mkdir($cache_dirname,0777)){
  15.   $this->warn('緩存文件不存在而且不能創(chuàng)建,需要手動創(chuàng)建.');
  16.   return false;
  17.   }
  18.  }
  19. $this->cache_dir = $cache_dirname;
  20. }
  21. function __destruct(){
  22.  echo 'Cache class bye.';
  23. }
  24. function get_url() {
  25.         if (!isset($_SERVER['REQUEST_URI'])) {
  26.                 $url = $_SERVER['REQUEST_URI'];
  27.         }else{
  28.                 $url = $_SERVER['SCRIPT_NAME'];
  29.                 $url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
  30.         }
  31.         return $url;
  32. }
 
 
 
  1. function warn($errorstring){
  2. echo "發(fā)生錯誤:
    ".$errorstring."
    ";
  3. }
  4. function cache_page($pageurl,$pagedata){
  5.  if(!$fso=fopen($pageurl,'w')){
  6.   $this->warns('無法打開緩存文件.');//trigger_error
  7.   return false;
  8.  }
  9.  if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
  10.   $this->warns('無法鎖定緩存文件.');//trigger_error
  11.   return false;
  12.  }
  13.  if(!fwrite($fso,$pagedata)){//寫入字節(jié)流,serialize寫入其他格式
  14.   $this->warns('無法寫入緩存文件.');//trigger_error
  15.   return false;
  16.  }
  17.  flock($fso,LOCK_UN);//釋放鎖定
  18.  fclose($fso);
  19.  return true;
  20. }
  21. function display_cache($cacheFile){
  22.             if(!file_exists($cacheFile)){
  23.     $this->warn('無法讀取緩存文件.');//trigger_error
  24.     return false;
  25.             }
  26.    echo '讀取緩存文件:'.$cacheFile;
  27. //return unserialize(file_get_contents($cacheFile));
  28.         $fso = fopen($cacheFile, 'r');
  29.         $data = fread($fso, filesize($cacheFile));
  30.         fclose($fso);
  31.  return $data;
  32. }
  33. function readData($cacheFile='default_cache.txt'){
  34.  $cacheFile = $this->cache_dir."/".$cacheFile;
  35.  if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
  36.   $data=$this->display_cache($cacheFile);
  37.   }else{
  38.    $data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",過期時間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
  39.    $this->cache_page($cacheFile,$data);
  40.  }
  41.   return $data;
  42. }
  43. }
  44. ?>

下面我打斷這個代碼逐行解釋.

#p#

程序透析

這個緩存類(類沒什么好怕的.請繼續(xù)看)名稱是cache,有2個屬性:

 
 
 
  1. private $cache_dir;
  2. private $expireTime=180;

$cache_dir是緩存文件所放的相對網站目錄的父目錄, $expireTime(注釋一)是我們緩存的數(shù)據過期的時間,主要是這個思路:

當數(shù)據或者文件被加載的時候,先判斷緩存文件存在不,返回false ,文件***修改時間和緩存的時間和比當前時間大不,大的話說明緩存還沒到期,小的話返回false,當返回false的時候,讀取原始數(shù)據,寫入緩存文件中,返回數(shù)據。接著看程序:

 
 
 
  1. function __construct($cache_dirname){
  2.  if(!@is_dir($cache_dirname)){
  3.   if(!@mkdir($cache_dirname,0777)){
  4.   $this->warn('緩存文件不存在而且不能創(chuàng)建,需要手動創(chuàng)建.');
  5.   return false;
  6.   }
  7.  }
  8. $this->cache_dir = $cache_dirname;
  9. }

當類***次被實例的時候構造默認函數(shù)帶參數(shù)緩存文件名稱,如文件不存在,創(chuàng)建一個有編輯權限的文件夾,創(chuàng)建失敗的時候拋出異常.然后把cache類的 $cache_dir屬性設置為這個文件夾名稱,我們的所有緩存文件都是在這個文件夾下面的.

 
 
 
  1. function __destruct(){
  2.  echo 'Cache class bye.';
  3. }

這是class類的析構函數(shù),為了演示,我們輸出一個字符串表示我們釋放cache類資源成功.

 
 
 
  1. function warn($errorstring){
  2. echo "發(fā)生錯誤:
    ".$errorstring."
    ";
  3. }

這個方法輸出錯誤信息:

 
 
 
  1. function get_url() {
  2.         if (!isset($_SERVER['REQUEST_URI'])) {
  3.                 $url = $_SERVER['REQUEST_URI'];
  4.         }else{
  5.                 $url = $_SERVER['SCRIPT_NAME'];
  6.                 $url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
  7.         }
  8.         return $url;
  9. }

這個方法返回當前url的信息,這是我看國外很多人的cms系統(tǒng)這樣做,主要是緩存x.PHP?page=1,x.PHP?page=2,等這種文件的,這里列出是為了擴展的這個cache類功能的。

 
 
 
  1. function cache_page($pageurl,$pagedata){
  2.  if(!$fso=fopen($pageurl,'w')){
  3.   $this->warns('無法打開緩存文件.');//trigger_error
  4.   return false;
  5.  }
  6.  if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
  7.   $this->warns('無法鎖定緩存文件.');//trigger_error
  8.   return false;
  9.  }
  10.  if(!fwrite($fso,$pagedata)){//寫入字節(jié)流,serialize寫入其他格式
  11.   $this->warns('無法寫入緩存文件.');//trigger_error
  12.   return false;
  13.  }
  14.  flock($fso,LOCK_UN);//釋放鎖定
  15.  fclose($fso);
  16.  return true;
  17. }

#p#

cache_page方法分別傳入的是緩存的文件名稱和數(shù)據,這是把數(shù)據寫到文件里的方法,先用fopen打開文件,然后調用句柄鎖定這個文件,然后用fwrite寫入文件,***釋放這個句柄,任何一步發(fā)生錯誤將拋出錯誤. 您可能看到這個注釋:

寫入字節(jié)流,serialize寫入其他格式,順便一提的是如果我們要把一個數(shù)組,(可以從MySQL數(shù)據庫里面select查詢除了的結果)用serialize函數(shù)寫入,用unserialize讀取到原來的類型。

 
 
 
  1. function display_cache($cacheFile){
  2.             if(!file_exists($cacheFile)){
  3.     $this->warn('無法讀取緩存文件.');//trigger_error
  4.     return false;
  5.             }
  6.    echo '讀取緩存文件:'.$cacheFile;
  7. //return unserialize(file_get_contents($cacheFile));
  8.         $fso = fopen($cacheFile, 'r');
  9.         $data = fread($fso, filesize($cacheFile));
  10.         fclose($fso);
  11.  return $data;
  12. }

這是由文件名稱讀取緩存的方法,直接打開文件,讀取全部,如果文件不存在的或者無法讀取的話返回false,當然,你感到不人性的話,可以重新生成緩存.

 
 
 
  1. function readData($cacheFile='default_cache.txt'){
  2.  $cacheFile = $this->cache_dir."/".$cacheFile;
  3.  if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
  4.   $data=$this->display_cache($cacheFile);
  5.   }else{
  6.    $data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",過期時間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
  7.    $this->cache_page($cacheFile,$data);
  8.  }
  9.   return $data;
  10. }

這個函數(shù)是我們調用的方法,可以寫成接口的方法,由傳入參數(shù)判斷文件存在不,文件***修改時間+expireTime的時間是不是過了當前時間(大于的話說明沒有過期),如果文件不存在或者已經過期,重新加載原始數(shù)據,這里,為了簡單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數(shù)據庫的數(shù)據.(注釋2)

補充說明 結語

注釋一:這個緩存的時間您可以自己調,可以根據時間情況讀取數(shù)組,xml,緩存等,請按照您的方便,值得一提的是緩存的時間(也就是緩存的key)也用緩存控制,.這在cms系統(tǒng)中被廣泛使用,他們把要更新的key放在緩存中,非常容易控制全戰(zhàn)。

注釋二:PHP5開始支持類繼承,這是讓人興奮的,把網站全局休息寫在一個配置的類里面,再寫與數(shù)據層交互的類(如與MySQL交互的類),我們的這個cache類繼承數(shù)據交互的類,可以非常容易的讀取數(shù)據庫,這是外話,此處不再展開,有時間和大家詳談。


網站名稱:深入探討PHP緩存技術
文章位置:http://www.5511xx.com/article/cddeegc.html