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 相关文章推荐
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
PHP+MYSQL中文乱码问题
Jul 01 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 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调用Oracle存储过程
2006/10/09 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
详解Python中expandtabs()方法的使用
2015/05/18 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python利用命名空间解析XML文档
2020/08/10 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
UGG英国官方网站:UGG UK
2018/02/08 全球购物
《兰亭集序》教学反思
2014/02/11 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
市场营销专业求职信
2014/06/17 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫
Python实现Hash算法
2022/03/18 Python