php 生成静态页面的办法与实现代码详细版


Posted in PHP onFebruary 15, 2010

php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模版中改变的部位。不过此种方法太麻烦,值得推荐的方法是直接把原来生成的模版砍掉,重新生成,呵呵,真正的一了百了。
还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。而针对列表页,如果信息更新不是很频繁的话,也是可取的。现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台“生成html页”的按钮来“半自动”生成html的。而对一些信息量非常大的门户网站,则行不通。因为静态页之所以叫“静态”,是因为其不可自动改变。如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。如果我有10个这样的栏目,那想想也够吐血的了。
好了,闲话少说,现在来看看实际的程序演示:
first:是一个利用ob函数来实现的,代码比较简单,效率相对也高一些。

<?php 
ob_start(); 
@readfile("http://tools.3water.com/"); 
$text = ob_get_flush(); 
$myfile = fopen("myfile.html","w"); 
$text = 
str_replace ("{counent}",$string,$text); 
fwrite($myfile,$text); 
ob_clean(); 
?>

因为就算要生成静态页面,动态读取那部分也是要保留的,把数据插入数据库后,把url传递给readfile函数,然后读入缓存,fwrite一下就可以生成静态页面,这个是驼驼最欣赏的一种作法。代码行数最少,效率最高。http://tools.3water.com/是一个裸页,也就是单纯的内容,没有头,尾,菜单。这样才能比较自由的定制自己的模版myfile.html。如果仅仅是要求生成静态页的话,这样基本上就满足需求了。
second:普通生成静态html页。
这种作法就是按部就班的来做,fread进来页面,然后str_replace替换
首先是创建最终内容页:
PHP代码
<?php 
$title = "http://siyizhu.com测试模板"; 
$file = "TwoMax Inter test templet,<br>author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]"; 
$fp = fopen ("temp.html","r"); 
$content = fread($fp,filesize ("temp.html")); 
$content = str_replace("{file}",$file,$content); 
$content = str_replace("{title}",$title,$content); 
$filename = "test/test.html"; 
$handle = fopen ($filename,"w"); //打开文件指针,创建文件 
/*  检查文件是否被创建且可写 */ 
if (!is_writable ($filename)) 
{ 
die ("文件:".$filename."不可写,请检查其属性后重试!"); 
} 
if (!fwrite ($handle,$content)) 
{ //将信息写入文件 
die ("生成文件".$filename."失败!"); 
} 
fclose ($handle); //关闭指针 
die ("创建文件".$filename."成功!"); 
?>

这一步比较简单。只是单纯的变量替换即可。如果要生成静态的列表页面的话,原理也是一样,用程序来生成文章列表,把它当成一个大的变量,替换模版中的变量,列表的翻页页是如此。当然,如果有信息更新的话,列表翻页也是要重新生成的。
PHP代码
<?php 
$title = "http://"; 
$file = "TwoMax Inter test templet,<br>author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]"; 
$fp = fopen ("temp.html","r"); 
$content = fread ($fp,filesize ("temp.html")); 
$content = str_replace ("{file}",$file,$content); 
$content = str_replace ("{title}",$title,$content); 
// 生成列表开始 
$list = ''; 
$sql = "select id,title,filename from article"; 
$query = mysql_query ($sql); 
while($result = mysql_fetch_array ($query)) 
{ 
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$result['title'].'</a><br>'; 
} 
$content .= str_replace("{articletable}",$list,$content);//生成列表结束 
// echo $content; 
$filename = "test/test.html"; 
$handle = fopen ($filename,"w"); 
//打开文件指针,创建文件 
/* 检查文件是否被创建且可写 */ 
if(!is_writable ($filename)) 
{ 
die ("文件:".$filename."不可写,请检查其属性后重试!"); 
} 
if(!fwrite($handle,$content)) 
{ //将信息写入文件 
die ("生成文件".$filename."失败!"); 
} 
fclose($handle); //关闭指针 
die ("创建文件".$filename."成功!"); 
?>

关于翻页:
如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die ("创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。
例:
PHP代码
<?php 
$fp = fopen ("temp.html","r"); 
$content = fread ($fp,filesize ("temp.html")); 
$onepage = '20'; 
$sql = "select id from article where channel='$channelid'"; 
$query = mysql_query ($sql); 
$num = mysql_num_rows ($query); 
$allpages = ceil ($num / $onepage); 
for ($i = 0;$i<$allpages; $i++) 
{ 
if ($i == 0) 
{ 
$indexpath = "index.html"; 
} 
else 
{ 
$indexpath = "index_".$i."html"; 
} 
$start = $i * $onepage; 
$list = ''; 
$sql_for_page = "select name,filename,title from article where channel='$channelid' limit $start,$onepage"; 
$query_for_page = mysql_query ($sql_for_page); 
while ($result = $query_for_page) 
{ 
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$title.'</a><br>'; 
} 
$content = str_replace("{articletable}",$list,$content); 
if (is_file ($indexpath)) 
{ 
@unlink ($indexpath); //若文件已存在,则删除 
} 
$handle = fopen ($indexpath,"w"); //打开文件指针,创建文件 
/*检查文件是否被创建且可写 */ 
if (!is_writable ($indexpath)) 
{ 
echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo 
} 
if (!fwrite ($handle,$content)) 
{//将信息写入文件 
echo "生成文件".$indexpath."失败!"; //修改为echo 
} 
fclose ($handle); //关闭指针 
} 
fclose ($fp); 
die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!"); 
?>

third:smarty模版生成静态页面
smarty自己有一个fetch函数,其功用有点类似于fread()可以用来生成静态的页面.
这个例子大家想必看起来眼熟,对,smarty手册中关于fetch函数的例子,比竟官方的例子总是很经典的嘛!
PHP代码
<?php 
include("Smarty.class.php"); 
$smarty = new Smarty; 
$smarty->caching = true; 
// only do db calls if cache doesn't exist 
if(!$smarty->is_cached("index.tpl")) 
{// dummy up some data 
$address = "245 N 50th"; 
$db_data = array("City" => "Lincoln", "State" => "Nebraska", "Zip" => "68502"); 
$smarty->assign("Name","Fred"); 
$smarty->assign("Address",$address); 
$smarty->assign($db_data); 
}// capture the output 
$output = $smarty->fetch("index.tpl"); 
//这个地方算是关键// do something with $output here 
echo $output; //hoho 看到output的结果了吧 然后呢?fwrite一下,我们就得到我们所要的结果了。 
$fp = fopen("archives/2005/05/19/0001.html", "w"); 
fwrite($fp, $content); 
fclose($fp); 
?>

PHP代码
<?php 
ob_start(); 
echo "Hello World!"; 
$content = ob_get_contents();//取得php页面输出的全部内容 
$fp = fopen("archives/2005/05/19/0001.html", "w"); 
fwrite($fp, $content); 
fclose($fp); 
?>
PHP 相关文章推荐
php日历[测试通过]
Mar 27 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
使用bcompiler对PHP文件进行加密的代码
Aug 29 PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 PHP
解析PHP缓存函数的使用说明
May 10 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
php数组合并与拆分实例分析
Jun 12 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
IP138 IP地址查询小偷实现代码
Feb 15 #PHP
PHP采集相关教程之一 CURL函数库
Feb 15 #PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 #PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 #PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 #PHP
一步一步学习PHP(3) php 函数
Feb 15 #PHP
一步一步学习PHP(2)――PHP类型
Feb 15 #PHP
You might like
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
PHP操作数组相关函数
2011/02/03 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
jQuery技巧总结
2011/01/01 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
javascript表单正则应用
2017/02/04 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
详解anaconda安装步骤
2020/11/23 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
白血病募捐倡议书
2014/05/14 职场文书
销售人员求职信
2014/07/22 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
查摆剖析材料范文
2014/09/30 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
加强作风建设工作总结
2014/10/23 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
会计工作检讨书
2015/02/19 职场文书
小学家长意见怎么写
2015/06/03 职场文书
办公室卫生管理制度
2015/08/04 职场文书
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS