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 相关文章推荐
一个图形显示IP的PHP程序代码
Oct 19 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
PHP中实现crontab代码分享
Mar 26 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
PHP培训要多少钱
Jun 06 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 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编写的SVN类
2013/07/18 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python实现连接mongodb的方法
2015/05/08 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python 如何设置守护进程
2020/10/29 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
写求职信有哪些注意事项
2014/05/08 职场文书
材料物理专业求职信
2014/09/01 职场文书