• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > php编程 >

深入探讨PHP缓存技术(3)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-02-11点击:

  $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)

  补充说明 结语

  注释一:这个缓存的时间您可以自己调,可以根据时间情况读取数组,xml,缓存等,请按照您的方便,值得一提的是缓存的时间(也就是缓存的key)也用缓存控制,.这在cms系统中被广泛使用,他们把要更新的key放在缓存中,非常容易控制全战。

  注释二:PHP5开始支持类继承,这是让人兴奋的,把网站全局休息写在一个配置的类里面,再写与数据层交互的类(如与MySQL交互的类),我们的这个cache类继承数据交互的类,可以非常容易的读取数据库,这是外话,此处不再展开,有时间和大家详谈。

标签: 深入 探讨 缓存

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1170734538@qq.com ,  QQ