制作缓存的目的是为了让我们的页面运行更加快速,减少读取数据库内容的次数,给用户更好的体验,为此我们可以使自己的程序做一下缓存,并且设置一个缓存过期的时间,来保证与数据库的一致,当然并不是所有的程序都适合做缓存,这里简单介绍一下php静态缓存制作的方法:
1.首先我们要定好一个缓存文件存放的位置,即存放目录(李昌辉)
例如我这里存放在cache目录下,将来所有的缓存文件都放到该目录下
2.在要做静态缓存的页面,我们定义一个变量来存放一个缓存文件的路径(相对于当前页面的路径)
$filename = "./cache/test.html";
3.定义一个变量来存储缓存过期时间
$cachetime = 5;
4.判断一下,缓存文件是否存在或者是否过期,如果缓存文件不存在就执行源代码生成缓存,或者时间过期了也应该重新缓存一下,如果上述条件不满足则调用缓存页面显示。
if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) { //缓存页面代码 } else { include($filename);//如果存在,调用缓存文件 }
5.生成缓存,在页面输出内容之前,我们调用ob_start()方法打开内存缓冲区,将要输出的内容放到内存里面。
ob_start();
6.在页面输出完之后,将内存中获取到的内容保存下来,存为一个静态页面。
//从内存缓存中获取页面代码 $content = ob_get_contents(); //将获取到的内容存放到缓存文件 file_put_contents($filename,$content); //清掉内存缓存 ob_flush();
7.最后我们加上一段输出,来测试是否重新缓存了,如果页面有输出该内容代表重新生成了缓存文件,如果没有,说明是直接读的缓存文件
echo "######################################"; //测试是否调用了缓存文件,缓存文件不输出这句话
这样我们就简单做了一个静态缓存,完整代码如下:
<?php $filename = "./cache/test.html"; //定义缓存有效期 $cachetime = 5; //判断缓存文件是否存在 if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) //filemtime($filename)获取文件修改时间,加上定义的缓存时间小于当前时间 { //开启内存缓存 ob_start(); ?> <!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> <h1>水果信息表</h1> <table width="100%" border="1" cellpadding="0" cellspacing="0" > <tr> <td>代号</td> <td>名称</td> <td>价格</td> <td>产地</td> <td>库存</td> <td>操作</td> </tr> <?php //造连接对象 $db = new MySQLi("localhost","root","123","mydb"); //写SQL语句 $sql = "select * from fruit"; //执行 $result = $db->query($sql); //取数据 /*$attr = $result->fetch_all(); foreach($attr as $v) { echo "<tr><td>{$v[0]}</td><td>{$v[1]}</td><td>{$v[2]}</td><td>{$v[3]}</td><td>{$v[4]}</td></tr>"; }*/ while($attr = $result->fetch_row()) { echo "<tr><td>{$attr[0]}</td><td>{$attr[1]}</td><td>{$attr[2]}</td><td>{$attr[3]}</td><td>{$attr[4]}</td><td> <a href='shanchu.php?code={$attr[0]}' onclick="return confirm('确定删除么')"> 删除 </a> <a href='xiugai.php?code={$attr[0]}'>修改</a> </td></tr>"; } ?> </table> <a href="add.php">添加数据</a> </body> </html> <?php //从内存缓存中获取页面代码 $content = ob_get_contents(); //将获取到的内容存放到缓存文件 file_put_contents($filename,$content); //清掉内存缓存 ob_flush(); echo "######################################"; //测试是否调用了缓存文件,缓存文件不输出这句话 } else { include($filename); //如果存在,调用缓存文件 } ?>
最后来看一下,效果:
第一次执行该页面,出现缓存:
再次执行,则没有重新建立缓存,而是直接读取的静态页面test.html:
过了一段时间,又重新生成了缓存,这个时间就是我们之前设置的缓存过期时间。