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下10件你也许并不了解的事情
Sep 11 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
twig里使用js变量的方法
Feb 05 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
yii2实现根据时间搜索的方法
May 25 PHP
详解PHP队列的实现
Mar 14 PHP
php传值和传引用的区别点总结
Nov 19 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
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PDO::commit讲解
2019/01/27 PHP
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
谈谈JavaScript数组常用方法总结
2017/01/24 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
原生js实现验证码功能
2017/03/16 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
python中的多线程实例教程
2014/08/27 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
讲解Python中的递归函数
2015/04/27 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python3 集合set入门基础
2020/02/10 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
详解python的变量缓存机制
2021/01/24 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
医学专业毕业生求职信
2014/06/20 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python