偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入探討PHP緩存技術(shù)

開發(fā) 后端
PHP,一門最近幾年興起的Web設(shè)計(jì)腳本語(yǔ)言,由于它的強(qiáng)大和可伸縮性,近幾年來(lái)得到長(zhǎng)足的發(fā)展。文章將著重分析PHP中的緩存技術(shù),也就是Cache技術(shù)。一般來(lái)說(shuō),緩存的目的是把數(shù)據(jù)放在一個(gè)地方讓訪問(wèn)的更快點(diǎn)。

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

分析深入

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

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

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

下面我打斷這個(gè)代碼逐行解釋.

#p#

程序透析

這個(gè)緩存類(類沒(méi)什么好怕的.請(qǐng)繼續(xù)看)名稱是cache,有2個(gè)屬性:

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

$cache_dir是緩存文件所放的相對(duì)網(wǎng)站目錄的父目錄, $expireTime(注釋一)是我們緩存的數(shù)據(jù)過(guò)期的時(shí)間,主要是這個(gè)思路:

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

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

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

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

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

  1. function warn($errorstring){  
  2. echo "<b><font color='red'>發(fā)生錯(cuò)誤:<pre>".$errorstring."</pre></font></b>";  

這個(gè)方法輸出錯(cuò)誤信息:

  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.  
  9.         return $url;  
  10. }  

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

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

#p#

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

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

  1. function display_cache($cacheFile){  
  2.             if(!file_exists($cacheFile)){  
  3.     $this->warn('無(wú)法讀取緩存文件.');//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;  

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

  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 <b>".date('l dS \of F Y h:i:s A')."</b>,過(guò)期時(shí)間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";  
  7.    $this->cache_page($cacheFile,$data);  
  8.  }  
  9.   return $data;  

這個(gè)函數(shù)是我們調(diào)用的方法,可以寫成接口的方法,由傳入?yún)?shù)判斷文件存在不,文件***修改時(shí)間+expireTime的時(shí)間是不是過(guò)了當(dāng)前時(shí)間(大于的話說(shuō)明沒(méi)有過(guò)期),如果文件不存在或者已經(jīng)過(guò)期,重新加載原始數(shù)據(jù),這里,為了簡(jiǎn)單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數(shù)據(jù)庫(kù)的數(shù)據(jù).(注釋2)

補(bǔ)充說(shuō)明 結(jié)語(yǔ)

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

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

【編輯推薦】

  1. PHP文件緩存包含三種格式
  2. PHP數(shù)據(jù)緩存類必要性分析
  3. PHP緩存機(jī)制的具體講解
責(zé)任編輯:王曉東 來(lái)源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2009-12-07 13:55:58

PHP array_m

2009-12-07 16:07:03

PHP類的繼承

2009-12-01 15:48:12

提高PHP運(yùn)行效率

2009-12-02 11:20:56

PHP命令行參數(shù)

2009-12-02 16:46:18

PHPMailer

2009-12-01 16:34:21

PHP表單

2010-03-01 17:57:11

WCF緩存機(jī)制

2009-12-07 19:06:20

PHP mysql_f

2009-12-23 16:13:00

WPF Attache

2010-11-22 14:18:32

MySQL鎖機(jī)制

2009-12-28 14:59:23

寬帶接入技術(shù)ADSL技

2009-11-20 17:17:08

Oracle函數(shù)索引

2021-05-17 05:36:02

CSS 文字動(dòng)畫技巧

2010-01-18 18:20:07

軟交換技術(shù)

2009-12-10 13:14:26

PHP下拉框

2009-12-07 11:21:59

PHP生成縮略圖

2009-11-27 10:46:14

GPRS路由

2010-03-05 13:44:00

Python序列

2023-01-12 17:18:06

數(shù)據(jù)庫(kù)多云

2010-03-31 14:58:03

云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)