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 array_flip() 删除数组重复元素
Jan 14 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 PHP
深入PHP数据加密详解
Jun 18 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
Thinkphp单字母函数使用指南
May 08 PHP
php模拟post上传图片实现代码
Jun 24 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
PHP单链表的实现代码
Jul 05 PHP
浅谈PHP的反射API
Feb 26 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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
星际争霸中的热键
2020/03/04 星际争霸
php动态生成JavaScript代码
2009/03/09 PHP
PHP 实用代码收集
2010/01/22 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
Python随机生成手机号、数字的方法详解
2017/07/21 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python plotly画柱状图代码实例
2019/12/13 Python
tornado+celery的简单使用详解
2019/12/21 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
python实现登录与注册系统
2020/11/30 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
机电一体化毕业生求职信
2013/11/02 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
端午节活动总结报告
2015/02/11 职场文书
导游词之襄阳古城
2019/09/27 职场文书
导游词之日月潭
2019/11/05 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python