用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的ob_start();控制您的浏览器cache!
Nov 25 PHP
php foreach、while性能比较
Oct 15 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
php使用websocket示例详解
Mar 12 PHP
Chrome Web App开发小结
Sep 04 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
Mar 09 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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
Windows下的PHP5.0详解
2006/11/18 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
详解Bootstrap插件
2016/04/25 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
JavaScript实现京东放大镜效果
2019/12/03 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python读写文件write和flush的实现方式
2020/02/21 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
应届毕业生个人求职信范文
2014/01/29 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
钢琴师观后感
2015/06/12 职场文书