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 cli模式学习(PHP命令行模式)
Jun 03 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
PHP中if和or运行效率对比
Dec 12 PHP
php简单socket服务器客户端代码实例
May 18 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
javascript如何创建对象
2016/08/29 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
sklearn+python:线性回归案例
2020/02/24 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
python logging模块的使用详解
2020/10/23 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
JSF界面控制层技术
2013/06/17 面试题
标准毕业生自荐信
2014/06/24 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
毕业论文致谢词
2015/05/14 职场文书
严以律己学习心得体会
2016/01/13 职场文书
2019年大学推荐信
2019/06/24 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python
Python读写yaml文件
2022/03/20 Python