缓存

什么叫缓存?

定义:缓存就是数据交换的缓冲区(称作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,一个简单而又不庸俗的缓存小程序到此就完事了。^_^

原文地址:https://www.cnblogs.com/u1020641/p/6197477.html