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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
PHP消息队列用法实例分析
Feb 12 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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
Cakephp 执行主要流程
2010/03/24 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
护士感人事迹
2014/05/01 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
庆元旦演讲稿
2014/09/15 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
考研英语复习计划
2015/01/19 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL