简单静态页生成

一直用smarty的cache,但感觉还是要自己做一个,才有感觉。网上有很多牛人的功能比较完备,打算先自己搞简单的再慢慢丰满。这两天做了一个比较简单的,在hi.baidu.net/alex_wang58记录一下。一、用到的相关技术关键次:PHP, Apache,
                                               mod_rewrite (RewriteCond,RewriteRule)地址重写,
                                               fwrite()生成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文件用file()打开读取文章的php然后用fwrite() 生成一个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内容到剪贴板
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内容到剪贴板

PHP代码:

header("Content-Type:text/html; charset=gbk");//以防出现乱码
include("alexHtml.php");
$_alexHtml = new Html();
$root =& $_SERVER['DOCUMENT_ROOT'];      $filename "news_".$id.".html";
     
     
$flg $_alexHtml->createhtml("http://localhost/Test/newsDetail.php?id=".$id,$root."/Test/html",$filename);
     if (!
$flg){
        echo 
"写入静态数据失败!";
        exit();
     }
echo 
"";
?>

alexHtml.php ==============>简单的文件写入类

复制PHP内容到剪贴板
PHP代码:

class Html{
      
         function 
createhtml($url,$storePath,$htmlname){
           
           
$content file($url) or die("目标解析文件不存在!");//打开目标php文件
           
$content implode("",$content);
           
$handle fopen($storePath."/".$htmlname,"w") or die("静态内容写入失败,请检查文件读写权限!");
           if (
fwrite($handle,$content)){
              return 
true;
           }else{
              return 
false;
           }
           
           
fclose($handle);
           
         }
           
           function 
fileExist($file_name){
             if( 
file_exists($file_name) )
                  return 
true;
             else
                  return 
false;      
           }
      
      }
?>


newsDetail.php ====================> 从数据库中读取数据,产生新闻内容,内容被
getnews.php捕获

复制PHP内容到剪贴板
PHP代码:

header("Content-Type:text/html; charset=gbk");
if( isset(
$_GET['id']) ){
$id = & $_GET['id'];
}else{
header("Location: [url]http://127.0.0.1/lean/Test/html/news_failed.html[/url]");
exit();
}
mysql_connect("localhost","root","");
mysql_query('SET NAMES gbk');
mysql_select_db("wxx");
$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文件不存在时才启用重写规则。这样循环重定向的问题就没有了。

]]>

原创文章,作者:键盘游走者,如若转载,请注明出处:http://www.708034.com/2007/12/%e7%ae%80%e5%8d%95%e9%9d%99%e6%80%81%e9%a1%b5%e7%94%9f%e6%88%90/

发表评论

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