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 socket方式提交的post详解
Jul 19 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
PHP cookie与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
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python进阶篇之字典操作总结
2016/11/16 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
地理科学专业毕业生求职信
2013/10/15 职场文书
网络维护中文求职信
2014/01/03 职场文书
初中作文评语大全
2014/04/23 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技