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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php实现短信发送代码
Jul 05 PHP
PHP通过串口实现发送短信
Jul 08 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
Jan 15 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
PHP反射基础知识回顾
Sep 10 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 Smarty生成EXCEL文档的代码
2008/08/23 PHP
php上传文件的增强函数
2010/07/21 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
初识SmartJS - AOP三剑客
2014/06/08 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
python处理html转义字符的方法详解
2016/07/01 Python
python实现上传下载文件功能
2020/11/19 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
OpenCV 模板匹配
2019/07/10 Python
python怎么自定义捕获错误
2020/06/29 Python
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
中级会计职业生涯规划范文
2014/01/16 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
家长寄语大全
2014/04/02 职场文书
银行内勤岗位职责
2014/04/09 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
大学生年度个人总结
2015/02/15 职场文书
检讨书模板大全
2015/05/07 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python