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
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
Yii调试SQL的常用方法
Jul 09 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
Zend Framework入门知识点小结
Mar 19 PHP
php生成与读取excel文件
Oct 14 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 PHP
PHP7新增函数
Mar 09 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
VOLVO车载收音机
2021/03/02 无线电
smarty简单分页的实现方法
2014/10/27 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
js轮播图代码分享
2016/07/14 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python笔记之facade模式
2019/11/20 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
专科文秘应届生求职信
2013/11/18 职场文书
家长会演讲稿范文
2014/01/10 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
幼儿园辞职信
2015/05/13 职场文书
解除处分决定书
2015/06/25 职场文书
《春酒》教学反思
2016/02/22 职场文书
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server