用libTemplate实现静态网页的生成


Posted in PHP onOctober 09, 2006

作者:iwind

原来在dev-club发表的一篇文章,将怎么用模板处理程序PHPlib 中的template.inc实现静态网页的生成,呵呵,居然被列入精华,并被多个网站转载,想来这是荣幸。其实网上这方面的东西很多了,我上此发布的所谓IAMS( iwind 文章管理系统),里面也有,有心人可以看一下。下面我只是简要在总结一次。

现在一般说生成静态网页的方法有三种,一个是配置服务器,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,对于这个很多地方都有的。另外一个是用ob_函数控制输出。方法如下:先用ob_start();打开输出缓冲器,然后是对数据的分析,操作等等,跟着用ob_get_contents();获取缓冲区的内容,然后再写入文件。根据这个步骤,可以写出以下程序:
   <?php
   ob_start();
   //主体部分,数据操作,处理,输出等等。。。
   require”global.php”;
   mysql_connect(“localhost”,”root”,””);
   …..
   //获取缓冲区内容
   $contents=ob_get_contents();
   //如果不想输出任何东西,可以加上这句
   ob_end_clean();
   //写入目的文件
   $fp=@fopen($targetFile,”w+”) or die(“打开文件时出错”);
   fwrite($fp,$contents);
?>

这样就把这个动态页面的内容写入了静态页面,$targetFile.像有的网站首页内容很多,要调用n多个查询语句时,不妨定时生成静态网页,既大幅提高了访问速度,也减轻了服务器负担。

你可以看出来,我用ob_只是处理单个页面,对于批量写入或更新多个页面,这个方法就不行了。这就是我要讲的第三种方法,用模板。模板是个好东东,现在大家都或多或少在用它,建议还不会简单模板处理的网友,花点时间去学它,一般的模板处理程序都很简单的。用模板实现静态网页的生成是非常简单的,方法就是获取分析结果,把分析结果写入文件。下面就以PHPlib中的template.inc来谈谈如果用模板生成静态网页。

一, 修改template.inc
加入以下的几个函数:
//将分析结果保存到文件中去
  function savetofile ($dir,$varname){
   $data=$this->finish($this->get_var($varname));
   $fp=fopen($dir,"w+");
   fwrite($fp,$data);
  }
  //清除已赋值数组
   function renew(){
    $this->varkeys=array();
    $this->varvals=array();
    $this->file=array();
    }

第一个函数是结果保存到静态文件中,第二个是把所有的模板分析变量都置为空,以免批量处理时相互影响。

二,实现静态网页生成。
<?php
$itpl->set_file(“main”,”mian.tpl”);
//分析模板变量
…..
//分析mainmains
$tpl->parse("mains","main");
//把分析结果mains存入main.html
$tpl->savetofile("main.html","mains");
//置空
$tpl->renew();//至关重要
?>

呵呵,是不是很简单,main.html就是我们要的内容。下面是一个结合数据库的例子,并用函数封装了起来。
<?php
//$aid是数据库中的文章id,$table是表名称,$template是模板地址,$tpl是template.inc的一个实例
//每一个aid对应一个静态网页地址,都存在一个数据表中
//表的结构类似于 aid     target       title
//                1     a1.html     ….
//                2     a2.html     ….
//                3     a3.html     ….
function staticInfo($aid){
   global $table,$template,$tpl;
   //查询数据库
   $res=mysql_query(“select * from $table where aid='$aid'”);
   //取出数据
   $array=mysql_fetch_array($res);
   //读静态网页地址,标题。
   $target=$array[“target”];
$title=$array[“title”];
//分析模板
$tpl->set_file(“main”,$template);
//把模板中的{title}变量换成$title
$itpl->set_var(“title”,$title”);
//分析整个模板
$itpl->set_var(“mains”,”main”);
//把mains写入文件
$tpl->savetofile($target,"mains");
//置空
$tpl->renew();
}
?>

这样我们就可以用函数staticInfo()把我们想要处理的任一篇文章都生成静态网页。表$target里也可以包含文章内容,作者,来源等等,方法是一样的。

三,更新静态网页
一篇文章加入数据库后,由于一些原因我们总要修改一些文章。这时候,只要把相应的静态网页重新生成一次即可。这是非常方便的,因为表中已经有了静态网页的目标地址target字段。

可以看出关键所在,一篇文章生成静态网页的关键所在就是$template(模板地址),$target(目标地址)。前者,我们可以先确定,后者可以由你随心所欲的为每篇文章设置一个地址。常用的有1,时间戳 2,时分秒 3,根据文章id。因为这些重复的机会会非常小的。

四,批量生成静态网页.
有了单个文章生成的静态网页的函数了,那么批量生成是非常简单的。就是获取所有的文章aid,然后套入函数即可。
<?php
  //引用模板类
require”template.inc”;
//引入函数
require”functions.php”;
//一些变量的定义
$table=”art”;
$template=”template/info.tpl”;
$tpl=new Template(“.”);
  //连接mysql,选择数据库
mysql_connect(“localhost”,”root',””);
mysql_select_db(“article”);
//发送查询语句
$res=mysql_query(“select aid from $table”);
while($r=mysql_fetch_array($res)){
   $aid=$r[“aid”];
   //生成静态网页
   staticInfo($aid);
}
//结束
echo”所有静态网页更新/生成成功”;
?>

上面就是完整的例子。我们做cms的流程可以如下:
1,记者发稿(把稿件内容放入数据库)
2,编辑审查(如果他认为可以发布,那么就可以把这些内容生成静态网页)
3,退回稿件(把生成的静态网页删除,把数据库中的内容删除)

然后,我们访问到的网站内容就都是静态的了。一个问题就是,这种方法会不会占用很多空间内?http://www.knowsky.com 有上千篇文章了,只占用了20M空间。反过来说,如果你有10000篇文章的话,你不会吝啬到只买200M的空间吧?

或许你对生成静态的文章列表感到困惑,其实方法是一样的,就是 计算页码 分析每个页码的内容  写入文件。 分析每个页码的内容,当然是写个函数咯,如果你一页一页的生成,恐怕被人嘲笑 ^_^。

静态网页不仅仅是可以减轻服务器负担,提高访问速度,也可以方便地做镜像网站,方便地备份,减少被攻击损失程度,加快还原速度。当然静态网页也会给大家带来诸多不便的地方,你需要在动态和静态之间做出平衡,也可以在静态网页中加入js调用的php代码,来达到计数,即时更新等目的。(完)

PHP 相关文章推荐
PHP $_FILES函数详解
Mar 09 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
php注入实例
Oct 09 #PHP
967 个函式
Oct 09 #PHP
如何给phpadmin一个保护
Oct 09 #PHP
Search Engine Friendly的URL设计
Oct 09 #PHP
PHPlet在Windows下的安装
Oct 09 #PHP
一棵php的类树(支持无限分类)
Oct 09 #PHP
基于PHP+MySQL的聊天室设计
Oct 09 #PHP
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
车间工艺员岗位职责
2013/12/09 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
工作态度怎么写
2015/06/25 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang