php简单静态页生成过程

一直用smarty的cache,但感觉还是要自己做一个,才有感觉。网上有很多牛人的功能比较完备,打算先自己搞简单的再慢慢丰满。这两天做了一个比较简单的,在hi.baidu.net/alex_wang58记录一下。一、用到的相关技术关键词:PHP,
Apache, mod_rewrite 地址重写, ob系列函数缓冲
file_put_contents生成html二、流程:用户发出请求url?id=x
,判断文章是否存在 存在则直接转到对应的Html页面。
不存在通过php读取数据库数据,然后生成html文件,并存放到指定目录。三、实现方法:地址重写用Apahce的mod_rewrite模块中的RewriteRule指令实现重写。判断文章是否存在用Apahce
的mod_rewrite模块中的RewriteCond指令生成html文件:
ob_star()打开缓冲,将读取文章的php包含进来,然后用file_put_contents将获得的缓冲内容写入指定HTMl文件。四、代码/Test
目录下的 .htaccess 文件内容:RewriteEngine OnRewriteRule ^index.html$
/news.php [L]RewriteCond %{REQUEST_FILENAME}!-sRewriteRule
^html/news_([0-9]+).html$ getnews.php?id=$1
[L]对news.php的访问将通过 localhost/Test/index.html 实现由第二句

一、用到的相关技术关键词:PHP, Apache,
                                               mod_rewrite (RewriteCond,RewriteRule)地址重写,
                                               ob系列函数缓冲
                                               file_put_contents生成html

RewriteRule ^index.html$ Test/news.php [L] 实现news.php

news.php将列出文章标题链接。复制PHP内容到剪贴板PHP代码:?phpheader(Content-Type:text/html;charset=gbk);//以防出现乱码mysql_connect(localhost,root,);mysql_query('SETNAMESgbk');//我的数据库用的gbk编码,请根据自己实际情况调整mysql_select_db(test);$sql=SELECT`id`,`title`FROM`arc`orderby`id`DESC;$rs=mysql_query($sql);while($row=mysql_fetch_array($rs)){echoahref='/Test/html/news_$row[id].html'$row[title]/abr;}?比如生成了a
href=’/Test/html/news_3.html’php静态页实现/a当点击链接发出对 _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
来处理。getnews.php

二、流程:用户发出请求url?id=x ,判断文章是否存在
                        (1)存在则直接转到对应的Html页面。
                        (2)不存在通过php读取数据库数据,然后生成html文件,并存放到指定目录。

===================功能:判断参数传输的完整性,并调用相应文件生成html文件。复制PHP内容到剪贴板PHP代码:?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内容到剪贴板PHP代码:?phpheader(Content-Type:text/html;charset=gbk);if(isset($_GET['id'])){$id=$_GET['id'];}else{header(Location:[url]_failed.html[/url]);exit();}mysql_connect(localhost,root,);mysql_query('SETNAMESgbk');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倍左右。

三、实现方法:
(1)地址重写用Apahce的mod_rewrite模块中的RewriteRule指令实现重写(mod_rewrite的开启和简单规则见本博另一篇 … 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将列出文章标题链接。
复制代码 代码如下:
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 “$row[title]
“;
}
?>

比如生成了php静态页实现
当点击链接发出对  的请求时
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文件。
复制代码 代码如下:
$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捕获
复制代码 代码如下:
header(“Content-Type:text/html; charset=gbk”);
if( isset($_GET[‘id’]) ){
$id = & $_GET[‘id’];
}else{
header(“Location: “);
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倍左右。

发表评论

电子邮件地址不会被公开。 必填项已用*标注