一个不错的PHP缓存类介绍和PHP缓存函数介绍以及使用
缓存在实际使用当中应用很广泛,可以减轻对服务器的访问,提高运行速度。目前很多cms内容管理中频繁使用缓存机制来提高系统运行的效率。下面是一个写得不错的缓存类,可以参考下缓存的机制与写法。
cache.php 代码如下:
cachefilevar 及文件名 $this->cachefile //动态页的参数不同对应的cache文件也不同,但是每一个动态页的所有cache文件都有相同的文件名,只是扩展名不同 $s=array(".","/");$r=array("_",""); $this->cachefilevar=str_replace($s,$r,$_server["script_name"])."_".$_get[_actionvar_]; $this->cachefile=$this->cachefilevar.".".md5($_server["request_uri"]); } //删除当前页/模块的缓存 function delete() { //删除当前页的缓存 $d = dir(_cachepath_); $strlen=strlen($this->cachefilevar); //返回当前页的所有cache文件组 while (false !== ($entry = $d->read())) { if (substr($entry,0,$strlen)==$this->cachefilevar) { if (!unlink(_cachepath_."/".$entry)) {echo "cache目录无法写入";exit;} } } } //判断是否已cache过,以及是否需要cache function check() { //如果设置了缓存更新间隔时间 _recachetime_ if (_recachetime_+0>0) { //返回当前页cache的最后更新时间 $var=@file(_cachepath_."/".$this->cachefilevar);$var=$var[0]; //如果更新时间超出更新间隔时间则删除cache文件 if (time()-$var>_recachetime_) { $this->delete();$ischage=true; } } //返回当前页的cache $file=_cachepath_."/".$this->cachefile; //判断当前页cache是否存在 且 cache功能是否开启 return (file_exists($file) and _cacheenable_ and !$ischange); } //读取cache function read() { //返回当前页的cache $file=_cachepath_."/".$this->cachefile; //读取cache文件的内容 if (_cacheenable_) return readfile($file); else return false; } //生成cache function write($output) { //返回当前页的cache $file=_cachepath_."/".$this->cachefile; //如果cache功能开启 if (_cacheenable_) { //把输出的内容写入cache文件 $fp=@fopen($file,'w'); if (!@fputs($fp,$output)) {echo "模板cache写入失败";exit;} @fclose($fp); //如果设置了缓存更新间隔时间 _recachetime_ if (_recachetime_+0>0) { //更新当前页cache的最后更新时间 $file=_cachepath_."/".$this->cachefilevar; $fp=@fopen($file,'w'); if (!@fwrite($fp,time())) {echo "cache目录无法写入";exit;} @fclose($fp); } } } } ?>
类的使用:
check()) { $template=$cache->read(); } else { ob_start(); ob_implicit_flush(0); ?> 页面内容。。。。 write($template); } ?>
php的缓存相关函数介绍
有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息。它是于服务器同生死的,我们在保存缓存的时候可以指定下次更新的时间的判断,比方要在5分钟更新一次,可以记录上次更新的时间,和当前时间比较,如果大于 5 分钟 ,读取数据库,更新换成,否则直接读取缓存数据,当然,缓存需要客户端用户激活的,只需一次。
ob_start()函数
ob_start()函数:打开输出缓冲区。
函数格式 void ob_start(void)
说明:当缓冲区激活时,所有来自php程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
flush()函数
函数格式:flush()
说明:这个函数经常使用,效率很高。
string ob_get_contents()函数
ob_get_contents :返回内部缓冲区的内容。
函数格式:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 false。
ob_get_length()函数
ob_get_length:返回内部缓冲区的长度。
函数格式:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 false。
ob_end_clean()函数
ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区。
函数格式:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除。
ob_end_flush()函数
ob_end_flush:发送内部缓冲区的内容到,并且关闭输出缓冲区
函数格式:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)。
ob_implicit_flush()函数
函数格式:void ob_implicit_flush ([int flag])
说明:默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()。
php对静态页面的缓存技术研究
如果你的网站mysql数据库的速度比较慢,你就需要看重网站的缓存了。用过 wordpress 的朋友都知道,它有一个插件叫 wp super cache, 可以将 wordpress 的页面在第一次生成时储存成静态页面,当再次请求这个页面时,就省去了读取数据库的时间。这里讨论的就是这种技术。
第一个问题就是怎样获取 php 输出的内容了。获取输出内容的原因很简单,因为我们可以把输出的内容储存起来,当访客再次光临的时候就把事先存好的内容给他。
实现这些目的其实也同样简单。我们只要把函数 ob_start() 在内容输出前调用,然后在所有内容输出完成后调用 ob_get_contents() 获取输出的内容,再在此后调用 ob_end_flush() 表示结束就可以了,一个简单的例子如下:
在 php 标签之外的输出可以被记录。
我被记录了。
' ?>
程序运行结果:
在 php 标签之外的输出可以被记录。 我被记录了。 在 php 标签之外的输出可以被记录。 我被记录了。
可见,$cache变量保存了之前的输出结果。就是说,我们可以通过cache来减少php的结果输出。
有时我们有这样的习惯,对于管理员是不启用缓存的,而对游客则启用缓存。这个时候,其实实现起来也比较简单。我们可以自己编写两个函数 cache($id) 和 end_cache($id),分别表示缓存开始和缓存结束,然后代码如下(这里有三个函数省略了):
有的时候,站点可能会根据需要,建立了专门为移动设备设计的页面。那么,这种情况下我们就应该将 $id 扩展一下。这种扩展有很多种方法,比如添加另一个参数,将移动设备的页面存在不同于桌面设备的文件夹中,而这些页面使用相同的 $id . 另外还有一种做法,就是将原来的 $id 与移动设备的 user-agent 糅合在一起,md5() 一下就可以了。我偏向于前面那种做法。当然肯定还有其它类似的做法,总之中心思想就是把缓存的标记 ($id) 设置成不一样的东西,并且当用户回来后还能区别得出它们,就可以了。
还有的时候,一个网站有多种用户角色,可能要给相应的用户相应的缓存。当然,只需遵循上面的原则。
ob_start() 和 ob_end_flush() 是递归处理的。也就是说,可以在调用 ob_end_flush() 之前,调用若干次 ob_start() . 例如:
有的时候,站点可能会根据需要,建立了专门为移动设备设计的页面。那么,这种情况下我们就应该将 $id 扩展一下。这种扩展有很多种方法,比如添加另一个参数,将移动设备的页面存在不同于桌面设备的文件夹中,而这些页面使用相同的 $id . 另外还有一种做法,就是将原来的 $id 与移动设备的 user-agent 糅合在一起,md5() 一下就可以了。我偏向于前面那种做法。当然肯定还有其它类似的做法,总之中心思想就是把缓存的标记 ($id) 设置成不一样的东西,并且当用户回来后还能区别得出它们,就可以了。
还有的时候,一个网站有多种用户角色,可能要给相应的用户相应的缓存。当然,只需遵循上面的原则。
ob_start() 和 ob_end_flush() 是递归处理的。也就是说,可以在调用 ob_end_flush() 之前,调用若干次 ob_start() . 例如:
'; ob_start(); echo 'content2'.'
'; $output1 = ob_get_contents(); echo $output1.'
'; ob_end_flush(); $output2 = ob_get_contents(); echo $output2.'
'; ob_end_flush(); ?>
程序运行结果:
content1 content2 content2 content1 content2 content2