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与MySQL交互使用详解
Oct 09 PHP
PHP生成静态页
Nov 25 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 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
截获网站title标签之家内容的例子
2006/10/09 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
表单内同名元素的控制
2006/11/22 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
Python enumerate遍历数组示例应用
2008/09/06 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
中学自我评价
2014/01/31 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
教师网络培训感言
2014/03/09 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
导游词之张家口
2019/12/13 职场文书
在Python 中将类对象序列化为JSON
2022/04/06 Python