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 相关文章推荐
综合图片计数器
Oct 09 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
10个php函数实用却不常见
Oct 13 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 PHP
PHPMAILER实现PHP发邮件功能
Apr 18 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
javascript基础知识
2016/06/07 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python实现弹窗祝福效果
2019/04/07 Python
python命令行工具Click快速掌握
2019/07/04 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
六一儿童节活动策划方案
2014/01/27 职场文书
个人党性剖析材料
2014/02/03 职场文书
艺术节主持词
2014/04/02 职场文书
教师产假请假条
2014/04/10 职场文书
企业党员一句话承诺
2014/05/30 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript