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学习 字符串课件
Jun 15 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
php中的常用魔术方法总结
Aug 02 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
set_exception_handler函数在ThinkPHP中的用法
Oct 31 PHP
php生成随机颜色的方法
Nov 13 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
统计PHP目录中的文件数方法
Mar 05 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实现模拟post请求用法实例
2015/07/11 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
php实现文件上传基本验证
2020/03/04 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
深入Python函数编程的一些特性
2015/04/13 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
python实现翻译word表格小程序
2020/02/27 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
实用求职信模板范文
2019/05/13 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers