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来处理多个提交任务
Oct 09 PHP
谈谈新手如何学习PHP
Dec 14 PHP
php中看实例学正则表达式
Dec 25 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
PHP会话处理的10个函数
Aug 11 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 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类分享
2014/02/07 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
Python字符串处理实例详解
2017/05/18 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
安全检查管理制度
2014/02/02 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
销售岗位职责范本
2014/06/12 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书