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实现将GB编码转换为UTF8
Nov 25 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 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 编写的 25个游戏脚本
2009/05/11 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
详解Python中的array数组模块相关使用
2016/07/05 Python
Python中常用的内置方法
2019/01/28 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
如何验证python安装成功
2020/07/06 Python
Django自带的用户验证系统实现
2020/12/18 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
EJB的激活机制
2013/10/25 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
个人创业事迹材料
2014/12/30 职场文书
借条如何写
2015/05/26 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python