怎么用php语言来做文件缓存
使用缓存能够让我们的程序访问起来更加快速,缓存可以减少对数据库的操作,体验起来更好一些,对服务器的压力也小一些,当然服务速度很快
php文件执行完之后产生的解析完的数据,保存成静态的网页,下次打开的这个文件的时候,如果发现之前执行过了,就可以把之前保存的静态网页拿出来显示了
它也有个缺点,就是不能时时的与数据库同步
适用范围,一般的小程序都可以用缓存,对时间要求特别苛刻的,比如抢购什么的就不能使用缓存文件了
写缓存文件,
一样要有php文件
php文件还是放在main目录下
相对应的html文件还是写在对应的文件夹下
先把数据库的一系列数据输出一下
php文件中
<?php $filename = "../cache/huancun.html"; //缓存文件的路径 include("../init.inc.php"); include("../DBDA.php"); $db = new DBDA(); $sql = " select * from nation "; $arr = $db->Query($sql); $smarty->assign("shuzu",$arr); $smarty->display("huancun.html");
html文件中
<!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> </tr> <{foreach $shuzu as $v}> <tr> <td><{$v[0]}></td> <td><{$v[1]}></td> <td>操作</td> </tr> <{/foreach}> </table> </body> </html>
运行后数据就显示出来了
所谓的缓存,并不是把我们写的这些代码存下来,审查一下它的源代码
而是把这些保存下来,变成一个静态的,当刷新的时候,直接把已经保存下来的数据直接显示出来,就不再重新访问数据库了,这样节省了很多时间,那如果数据库里面的数据有所变动的话,再走缓存文件就不能把新的数据及时反馈出来了
上面的代码是没有写缓存操作的样子,下面再来做一下缓存操作
html文件中不用修改
php文件中
<?php $filename = "../cache/huancun.html"; //缓存文件的路径 //判断缓存文件是否存在,如果缓存文件存在直接调用缓存文件,如果缓存文件不 //存在重新缓存 if(file_exists($filename)) { //直接调用缓存 include($filename); } else { //重新缓存 ob_start(); //开启内存缓存 include("../init.inc.php"); include("../DBDA.php"); $db = new DBDA(); $sql = " select * from nation "; $arr = $db->Query($sql); $smarty->assign("shuzu",$arr); $smarty->display("huancun.html"); $str = ob_get_content(); //获取内存中的缓存内容 file_put_contents($filename,$str); ob_flush(); //关闭内存缓存 echo "#########################"; }
这个一开始运行肯定没有缓存,所以会输出最后的一串井号,再次刷新时就有缓存了,所以直接运行上面的代码,下面的代码就不走了
运行一下,看看效果
再来看一下cache文件夹里面有没有huancun.html文件
然后点开看一下
以静态的方式保存了这张表格
再刷新一下那张表格
刷新后表格下面的一串井号消失了
再刷新后也没有井号
所以走的是缓存文件
我们从数据库改个数据看看效果
改了第一个汉族
然后再刷新一下表格
数据并没有改变
说明缓存文件已经有了,再刷新就只走缓存文件了
再把这个缓存改进一下,只需改php文件就可以
给它加上有效期,每隔十秒重新缓存一次,这样就不会出现数据库改变,数据刷新不出来的结果了
刷新后井号消失
十秒后刷新,原来的缓存文件过期,就会重新缓存一遍,井号就又会出现
这样就是静态缓存的一种方法
分页的话也可以使用
php文件中
<?php $p=1; if(!empty($_GET["page"])) { $p=$_GET["page"]; } $filename = "../cache/huancun{$p}.html"; //缓存文件的路径 $time=30; //缓存有效期30秒 //判断缓存文件是否存在,如果缓存文件存在直接调用缓存文件,如果缓存文件不 //存在重新缓存 if(file_exists($filename) && ((filemtime($filename) + $time)>=time())) { //直接调用缓存 include($filename); } else { //重新缓存 ob_start(); //开启内存缓存 include("../init.inc.php"); include("../DBDA.php"); $db = new DBDA(); $sall = "select count(*) from nation"; $zts = $db->StrQuery($sall); include("../page.class.php"); $page = new Page($zts,5); $sql = " select * from nation ".$page->limit; $arr = $db->Query($sql); $smarty->assign("fpage",$page->fpage()); $smarty->assign("shuzu",$arr); $smarty->display("huancun.html"); $str = ob_get_contents(); //获取内存中的缓存内容 file_put_contents($filename,$str); ob_flush(); //关闭内存缓存 echo "#########################"; }
html文件中,只需要输出个分页就好了
然后运行
再点击第二页
第三页四页都可以点击
看一下cache目录下的文件
每个分页的内容都被保存下来了
30秒内刷新走的都是缓存文件
无论分多少页都可以