php 缓存工具类 实现网页缓存

php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存

一、文件缓存

二、数据查询结果缓存,使用内存来实现高速缓存

本例主要使用文件缓存。

主要原理使用缓存函数来存储网页显示结果,如果在规定时间里再次调用则可以加载缓存文件。


工具类代码:

//文件缓存类classCache{/***$dir:缓存文件存放目录*$lifetime:缓存文件有效期,单位为秒*$cacheid:缓存文件路径,包含文件名*$ext:缓存文件扩展名(可以不用),这里使用是为了查看文件方便*/private$dir;private$lifetime;private$cacheid;private$ext;/***析构函数,检查缓存目录是否有效,默认赋值*/function__construct($dir='',$lifetime=1800){if($this->dir_isvalid($dir)){$this->dir=$dir;$this->lifetime=$lifetime;$this->ext='.Php';$this->cacheid=$this->getcacheid();}}/***检查缓存是否有效*/privatefunctionisvalid(){if(!file_exists($this->cacheid))returnfalse;if(!(@$mtime=filemtime($this->cacheid)))returnfalse;if(mktime()-$mtime>$this->lifetime)returnfalse;returntrue;}/***写入缓存*$mode==0,以浏览器缓存的方式取得页面内容*$mode==1,以直接赋值(通过$content参数接收)的方式取得页面内容*$mode==2,以本地读取(fopenile_get_contents)的方式取得页面内容(似乎这种方式没什么必要)*/publicfunctionwrite($mode=0,$content=''){switch($mode){case0:$content=ob_get_contents();break;default:break;}ob_end_flush();try{file_put_contents($this->cacheid,$content);}catch(Exception$e){$this->error('写入缓存失败!请检查目录权限!');}}/***加载缓存*exit()载入缓存后终止原页面程序的执行,缓存无效则运行原页面程序生成缓存*ob_start()开启浏览器缓存用于在页面结尾处取得页面内容*/publicfunctionload(){if($this->isvalid()){//以下两种方式,哪种方式好?????require_once($this->cacheid);echo"<!--缓存-->";//echofile_get_contents($this->cacheid);exit();}else{ob_start();}}/***清除缓存*/publicfunctionclean(){try{unlink($this->cacheid);}catch(Exception$e){$this->error('清除缓存文件失败!请检查目录权限!');}}/***取得缓存文件路径*/privatefunctiongetcacheid(){return$this->dir.md5($this->geturl()).$this->ext;}/***检查目录是否存在或是否可创建*/privatefunctiondir_isvalid($dir){if(is_dir($dir))returntrue;try{mkdir($dir,0777);}catch(Exception$e){$this->error('所设定缓存目录不存在并且创建失败!请检查目录权限!');returnfalse;}returntrue;}/***取得当前页面完整url*/privatefunctiongeturl(){$url='';if(isset($_SERVER['REQUEST_URI'])){$url=$_SERVER['REQUEST_URI'];}else{$url=$_SERVER['Php_SELF'];$url.=empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING'];}return$url;}/***输出错误信息*/privatefunctionerror($str){echo'<div>'.$str.'</div>';}}



使用方法:

使用方法如下:

一部分代码放在要被缓存逻辑代码前面:

$cachedir='./Cache/';//设定缓存目录$cache=newCache($cachedir,33);//省略参数即采用缺省设置,$cache=newCache($cachedir);if(@$_GET['cacheact']!='rewrite'||@$_GET['clearCache']=='ok')//此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作$cache->load();//装载缓存,缓存有效则不执行以下页面代码//页面代码开始


一部分放在被缓存逻辑代码后面:

//页面代码结束$cache->write();//首次运行或缓存过期,生成缓存