缓存
什么叫缓存?
定义:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从数据库也就是内存中找
目的:程序运行起来更加快速。
(也就是说当遇到大型网站时,它的数据访问量是相当大的,如果在点击同一个地方时每次都要访问数据库,那给数据库所造成的压力还有运行速度可想而知,所以我们这里就用到了缓存。)
OK. 现在呢,我们来做一个缓存的小例子,以方便大家更好的认识缓存:
唉,等一下! 我差点忘了告诉你们,我这里呢是用的smarty模版做的小例子,所以,理解最重要。^_^
首先:我们新建一个PHP后台处理界面取名叫test,把它保存在main(后台处理)文件夹里面。
代码如下:
<?php include("../init.inc.php"); //引入smarty模版文件 include("../fengzhuang.class.php"); //引入封装类 $db = new fengzhuang(); $sql = "select * from rules"; //所查为rules表 $attr = $db->query($sql); //返回数组 $smarty->assign("rules",$attr); $smarty->display("test.html");
接下来,我们再建一个前端显示的页面取名为test.html, 把它保存在templates文件夹里面。
代码如下(因为这张表非常简单,所以只用两列显示就够了):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <table width="100%"; border="1" cellpadding="0" cellspacing="0"> <tr> <td>代号</td> <td>名称</td> </tr> <{foreach $rules as $v}> <tr> <td><{$v[0]}></td> <td><{$v[1]}></td> </tr> <{/foreach}> </table> </body> </html>
既然后台也有了,前端显示也有了,那么让我们来看一下所显示的界面是什么样的。
到这里,我相信同学们已经迫不及待了。
然后,也就是做缓存的开始。
第一:我们要在后台处理页面里面,定义一个该页面的缓存文件路径(这里缓存为静态页面,保存在cache文件夹内)
代码如下:
$filename = "../cache.testhuancun.html";
第二:判断一下缓存文件是否存在,当存在或不存在时,分别执行的内容
代码如下:
<?php $filename = "../cache.testhuancun.html"; if(file_exists($filename)) //判断文件是否存在 { ob_start(); //开启内存缓存 include("../init.inc.php"); include("../fengzhuang.class.php"); $db = new fengzhuang(); $sql = "select * from rules"; $attr = $db->query($sql); $smarty->assign("rules",$attr); $smarty->display("test.html"); //把内存里面的内容全部读出来,交给一个变量nr,现在nr里面就存了读取的内容了 $nr = ob_get_contents(); //将读到的内容存放到缓存文件 file_put_contents($filename,$nr); ob_flush(); //清楚内存缓存 //为了更好的识别此页面是否是缓存页面,我们输出一串#进行辨别。有#时是读的内存,无#时是读的缓存 echo "#########################################################"; } else { include($filename); }
效果图如下(第一次刷新时,页面里面是显示#号串的, ≥两次的时候#号串消失,读的是缓存文件):
OK,一个简单的缓存就搞定了。 同学们是不是觉得有哪里不妥?
没错,这样是不行滴。你不可能把一个页面永远的缓存下来。那我们现在就来给他优化一下,比如说加个缓存时间,也就是说多长时间之后再去重新读内存。
方法:我们先设一个5秒的时间变量,然后在判断语句里加上(取缓存文件的上次修改时间小于当前时间),那么在这5秒内除了第一次是读的内存,其他都是读的缓存文件,在5秒
后又会重新读取一次内存,以此类推。
代码如下:
<?php $filename = "../cache/testhuancun.html"; $time = 5; //设置一个5秒的时间变量 if(!file_exists($filename) || filemtime($filename)+$time<time()) //判断文件是否存在 { ob_start(); //开启内存缓存 include("../init.inc.php"); include("../fengzhuang.class.php"); $db = new fengzhuang(); $sql = "select * from rules"; $attr = $db->query($sql); $smarty->assign("rules",$attr); $smarty->display("test.html"); //把内存里面的内容全部读出来,交给一个变量nr,现在nr里面就存了读取的内容了 $nr = ob_get_contents(); //将读到的内容存放到缓存文件 file_put_contents($filename,$nr); ob_flush(); //清楚内存缓存 //为了更好的识别此页面是否是缓存页面,我们输出一串#进行辨别 echo "#########################################################"; } else { include($filename); }
OK,一个简单而又不庸俗的缓存小程序到此就完事了。^_^