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制作图型计数器的例子
Oct 09 PHP
第八节--访问方式
Nov 16 PHP
php Memcache 中实现消息队列
Nov 24 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
php实现生成验证码实例分享
Apr 10 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
PHP中的self关键字详解
Jun 23 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投票系统防刷票判断流程分析
2012/02/04 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
prototype class详解
2006/09/07 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
基于vue2.0动态组件及render详解
2018/03/17 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
Sql面试题
2013/03/20 面试题
新春寄语大全
2014/04/09 职场文书
法院信息化建设方案
2014/05/21 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
雾霾停课通知
2015/04/24 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers