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 将图片按创建时间进行分类存储的实现代码
Jan 05 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP钩子实现方法解析
2019/05/21 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
使用js简单实现了tree树菜单
2013/11/20 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
Python实现的随机森林算法与简单总结
2018/01/30 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
Python全排列操作实例分析
2018/07/24 Python
浅析Python 多行匹配模式
2020/07/24 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
优秀学生自我鉴定范例
2013/12/18 职场文书
骨干教师培训制度
2014/01/13 职场文书
节能减排倡议书
2014/04/15 职场文书
关于运动会的口号
2014/06/07 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
企业介绍信范文
2015/01/30 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS