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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
php之Memcache学习笔记
Jun 17 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
PHP之预定义接口详解
Jul 29 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
jQuery知识点整理
2015/01/30 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
python获取糗百图片代码实例
2013/12/18 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
超简单使用Python换脸实例
2019/03/27 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Python configparser模块常用方法解析
2020/05/22 Python
Python类成员继承重写的实现
2020/09/16 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
给排水专业应届生求职信
2013/10/12 职场文书
爱护花草树木的标语
2014/06/11 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
试用期自我评价范文
2015/03/10 职场文书
班主任自我评价范文
2015/03/11 职场文书
地道战观后感500字
2015/06/04 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
小学三年级作文之写景
2019/11/05 职场文书