简单的页面缓冲技术


Posted in PHP onOctober 09, 2006

作者:limodou

前言

其实说它为技术,也许不能说是真正的技术。这只不过是我自已想出来的页面处理的方法,当然与别人 的想法可能是一致的。不过我还是想给它一个好听的名字。那么我这里所指的页面缓冲是什么呢?就是指将动态生成的页面保存起来,供下一次的使用。这样下一次访问它可能就不需要动态生成了。就象提供了一个cache 一样。在我的网站上,也许你的网站也是如此,使用了象模板之类的技术,这样用户所看到的页面就 是动态生成的。但是一个页面对于你是这样,对于别人可能还是这样,即在一段时间内是不会变化的,如果 将上次生成的结果直接返回给下一次访问的用户不是更好吗?减少了生成时间,效率要高一些。我想随着网 站的发展,速度与效率问题还是要考虑的。这里我给出我的实现,希望对大家有所帮助。只是一个思路,没 有具体的实现。

使用条件

是不是所有的网页最好都使用呢?我想不需要,而且也不可能。之所以能缓冲就是因为下一次访问与上 一次访问的内容可能是完全一样的。所以对于经常变化的页面就不合适了。比如页面上要显示计数信息的就不太合适。还有就是如果你的动态页面输出时,没有先输出到变量中,而是直接返回给用户,如使用echo, print ,readfile之类的输出,我个人认为现在还作不到。因为无法将输出结果得到,保存到文件中去(反 正我是想了半天没有想出有什么可以将直将输出的东西截下来,重定向到文件中去)。那么比较适的动态页面的处理就是:输出结果应该可以放到一个字符串之中。所以使用条件就是:
页面基本不会变化
动态页面的处理结果可以存放到字符串中

这样使用模板类来处理动态页面就很好了。通过在模板中设置可替换的变量,然后根据实际的值替换相 应的模板中的变量,同时可以将结果放到字符串中进行输出,这种模板类的处理非常适合保存处理后的页面。当然不使用模板类,也可以通过字符串的处理来生成输出结果也是可行的。至于怎么做就不讨论了。

实现

如前所述,不是一个真正的实现,而是一个实现的思路。

处理流程:

根据访问的要求,生成缓冲文件名
查看文件名是否存在,如果文件不存在,则生成动态页面,将页面保存,同时输出结果,结束;如果 存在,则执行第3步统计文件的修改时间,及与动态页面生成有关的文件的修改时间 比较缓冲文件的修改时间与其它页面的修改时间,如果其它页面修改时间大于缓冲文件修改时间,认为动态结果可能会发生变化,则重新生成动态页面结果,保存到文件中,且输出结果,结束;否则执行第5步
说明缓冲文件最新,则直接输出缓冲文件

这就是我的处理。至于缓冲文件如何保存,可以建一个临时目录也可以使用数据库处理。如果使用了数 据库则判断文件是否最新的方式也应作变化,比如在数据库中增加生成时间字段,比较这个时间字段与其它文件的修改时间即可。方法大家自已想。

我的具体实现的例子

为了帮助大家有个感性认识,这里我给出在我的主页上实现的基于文件处理的方法。只有主要的处理代
码,不完整。

--------------------------------------------------------------------------------
<?
1 $tmpfile="../tmp/".basename($REQUEST_URI);
2 $tmpfile=str_replace("?", "_", $tmpfile);
3 $tmpfile=str_replace("&", "_", $tmpfile);
4 if(file_exists($tmpfile))
5 {
6 $cflag=false;
7 $dtmp=filemtime($tmpfile);
8 $itmp=filemtime($incfile);
9 $cflag=$cflag | ($dtmp < $itmp);
10 $ctmp=filemtime(basename($PHP_SELF));
11 $cflag=$cflag | ($dtmp < $ctmp);
12 $ttmp=filemtime("template/content.ihtml");
13 $cflag=$cflag | ($dtmp < $ttmp);
14 }
15 else
16 $cflag=true;
17
18 if(!$cflag) //使用存在的文件
19 {
20 readfile($tmpfile);
21 exit;
22 }
23
24 //创建新的文件
25 include "template.class.php3";
26
27 $fp=fopen($incfile, "r");
28 $content=fread($fp, filesize($incfile));
29 fclose($fp);
30
31 //下面进行模版处理
32 $t = new Template("template", "keep");
33
34 $t->set_file("contentfile","content.ihtml");
35
36 $t->set_var(
37 array(
38 "content"=>$content
39 ));
40
41 $t->parse("outputcontent","contentfile");
42
43 $fp=fopen($tmpfile, "w");
44 if($fp)
45 {
46 flock($fp, 3);
47 fwrite($fp, $t->get_var("outputcontent"));
48 flock($fp, 1);
49 fclose($fp);
50 }
51 $t->p("outputcontent");
?>
--------------------------------------------------------------------------------

先向大家介绍一下我的目录结构:

/---bin/ 执行程序目录

| |--content.php3 用于处理文件显示的程序
   | |--template/ 用于存放模板文件的目录
   | |---content.ihtml 模板文件
   |-docs/ 数据文件

|-tmp/ 存放缓冲文件

content.php3文件用来处理动态页面。用户可以通过content.php3?page=id号来读出一个数据文件。具
体方法我就不说了,大家只要知道每个数据文件都有一个不同的id号,这样content.php3?page=id号的方式
就可以唯一标识一个数据文件。

第1-3行,生成临时文件名。将'?','&'等字符替换成'_'。
第4行,判断临时文件名是否存在,如果有则执行第18-22行,并结束。
第6-13行,判断与生成动态页面有关的文件修改时间与临时文件哪个更新,设置重新生成标志。在这里使用

filemtime()来得到最后修改时间。
第24-41行,利用模板类生成动态结果,放在变量中。关于模板的处理可以参考《模板,PHPLIB处理方式》

一文。
第43-50行,生成临时文件。此处对文件进行了加锁处理,以象写冲突。
第51行,输出结果。

这就是我的处理,大家可以自行修改。

缓冲是一项有意义的技术,可以提高访问速度,减少系统消耗。不过方法可能有多种多样,大家可以自
由发挥。

PHP 相关文章推荐
多文件上传的例子
Oct 09 PHP
PHP与MySQL交互使用详解
Oct 09 PHP
PHP 和 MySQL 开发的 8 个技巧
Jan 02 PHP
PHP 数组基础知识小结
Aug 20 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
Laravel5中contracts详解
Mar 02 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
php 之 没有mysql支持时的替代方案
Oct 09 #PHP
在PWS上安装PHP4.0正式版
Oct 09 #PHP
在IIS上安装PHP4.0正式版
Oct 09 #PHP
html中select语句读取mysql表中内容
Oct 09 #PHP
用PHP实现ODBC数据分页显示一例
Oct 09 #PHP
使用 php4 加速 web 传输
Oct 09 #PHP
php 中include()与require()的对比
Oct 09 #PHP
You might like
Zend的MVC机制使用分析(一)
2013/05/02 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
python异步Web框架sanic的实现
2020/04/27 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
汉语言文学毕业求职信
2014/07/17 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
解除租赁合同协议书
2016/03/21 职场文书