php简单静态页生成过程


Posted in PHP onMarch 27, 2008

一、用到的相关技术关键词:PHP, Apache,
                                               mod_rewrite (RewriteCond,RewriteRule)地址重写,
                                               ob系列函数缓冲
                                               file_put_contents生成html

二、流程:用户发出请求url?id=x ,判断文章是否存在
                        (1)存在则直接转到对应的Html页面。
                        (2)不存在通过php读取数据库数据,然后生成html文件,并存放到指定目录。

三、实现方法:
(1)地址重写用Apahce的mod_rewrite模块中的RewriteRule指令实现重写(mod_rewrite的开启和简单规则见本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判断文章是否存在用Apahce 的mod_rewrite模块中的RewriteCond指令
(3)生成html文件:
           ob_star()打开缓冲,将读取文章的php包含进来,然后用file_put_contents将获得的缓冲内容写入指定HTMl文件。
四、代码

/Test 目录下的 .htaccess 文件内容:

RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME}  !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]

对news.php的访问将通过 localhost/Test/index.html 实现由第二句 RewriteRule ^index.html$ Test/news.php [L] 实现

news.php =============================> news.php将列出文章标题链接。

<?php 
header("Content-Type:text/html; charset=gbk"); //以防出现乱码 
mysql_connect("localhost","root",""); 
mysql_query('SET NAMES gbk'); //我的数据库用的gbk编码,请根据自己实际情况调整 
mysql_select_db("test"); $sql = "Select `id`,`title` FROM `arc` order by `id` DESC"; 
$rs = mysql_query($sql); 
while($row = mysql_fetch_array($rs) ){ 
echo "<a href='/Test/html/news_$row[id].html'>$row[title]</a><br>"; 
} 
?>

比如生成了<a href='/Test/html/news_3.html'>php静态页实现</a>
当点击链接发出对 http://localhost/Test/html/news_3.html 的请求时
Apache将会判断 news_3.html  是否存在,由 .htaccess中的第三句 
RewriteCond %{REQUEST_FILENAME}  !-s 
实现:

     RewriteCond  是“定向重写发生条件”。REQUEST_FILENAME 这个参数是“客户端请求的文件名”
'-s'  (是一个非空的常规文件[size]) 测试指定文件是否存在而且是一个尺寸大于0的常规的文件.  !表示匹配条件的反转。
所以 RewriteCond 这句就表示当请求链接不存在时 执行下面的 RewriteRule 规则。

所以当请求的news_3.html 不存在时会重写地址让 getnews.php?id=3 来处理(否则如果news_3.html 存在则直接就加载该html文件)。

getnews.php ===================>功能:判断参数传输的完整性,并调用相应文件生成html文件。

<?php 
$id =$_GET['id']; 
$root =& $_SERVER['DOCUMENT_ROOT']; 
$filename = "news_".$id.".html"; 
$file = $root."/Test/html/".$filename; 
ob_start(); 
include($root."/Test/newsDetail.php"); 
file_put_contents($file,ob_get_contents()); 
ob_end_flush();  
?>

newsDetail.php ====================> 从数据库中读取数据,产生新闻内容,内容被getnews.php捕获
<?php 
header("Content-Type:text/html; charset=gbk"); 
if( isset($_GET['id']) ){ 
$id = & $_GET['id']; 
}else{ 
header("Location: http://127.0.0.1/lean/Test/html/news_failed.html"); 
exit(); 
} 
mysql_connect("localhost","root",""); 
mysql_query('SET NAMES gbk'); 
mysql_select_db("test"); 
$id =$_GET['id']; $sql = "Select `news` FROM `arc` Where `id`=$id"; 
$rs = mysql_query($sql); 
while($row = mysql_fetch_array($rs) ){ 
echo $row['news']; 
} 
?>

这样将会在/Test/html 目录下产生以 news_文章ID.html 命名的html文件。 

PS: 一开始在判断是否存在相应html页面时采用的是 php 内置的 file_exists() 判断,而不用Apache的 RewriteCond,也即没有 RewriteCond %{REQUEST_FILENAME}  !-s。看似可行,但结果会产生“循环重定向”的问题。 
       当news_3.html 不存在时 我们需要用 getnews.php生成news_3.html ,生成完毕后需要转向到 news_3.html ,于是又形成了一次请求mod_rewrite又启动把 news_3.html重写为 getnews.php?id=3 这就形成了死循环了。所以把文件存在性的判断交给 RewriteCond ,指定的html文件不存在时才启用重写规则。这样循环重定向的问题就没有了。 
       一开始没有采用fopen打开newsDetail.php,然后再将生成的内容fwrite成html文件,然后include输出静态页面。后来在fhjr999的提醒下,改为:将newDetail.php包含进getnews.php,通过ob系列函数将生成的内容放入缓冲,然后再生成html文件。ob的效率是前者的20倍左右。

PHP 相关文章推荐
php str_pad 函数使用详解
Jan 13 PHP
PHP教程 变量定义
Oct 23 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
PHP中通过trigger_error触发PHP错误示例
Jun 23 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
windows平台中配置nginx+php环境
Dec 06 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
CI框架集成Smarty的方法分析
May 17 PHP
详解WordPress中添加友情链接的方法
May 21 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
优化PHP代码的53条建议
Mar 27 #PHP
PHP连接access数据库
Mar 27 #PHP
某大型网络公司应聘时的笔试题目附答案
Mar 27 #PHP
php 无限极分类
Mar 27 #PHP
mysql时区问题
Mar 26 #PHP
How do I change MySQL timezone?
Mar 26 #PHP
有关 PHP 和 MySQL 时区的一点总结
Mar 26 #PHP
You might like
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python处理cookie详解
2014/02/07 Python
python抓取百度首页的方法
2015/05/19 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
Ajax和javascript的区别
2013/07/20 面试题
公司前台辞职报告
2014/01/19 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
学校团代会开幕词
2016/03/04 职场文书