日度归档:2010年5月13日

巧用apache的rewrite伪静态实现自动生成html静态化

以前用过或是写过的生成html静态化有一个最麻烦的操作,

每次新加一篇文章、新建一个分类或是在header或footer改动了文字,都要全盘重新生成,如果有几万甚至于几十万上百万篇文章,那还不是等它生成html等得郁闷。

所以有了一个新的想法,就是让用户第一次打开这篇文章或是列表、首页时,自动生成这篇文章或列表、首页的html文件。这样,当文章没有更新的情况下,每二个用户打开就是html了,这样就实现了自动化的生成静态。主要使用的是php中我们常写的文件缓存方式进行工作。

但是毕竟是生成静态化,跟url有关系,所以就想到了apache的rewrite伪静态
例如:文章的php完整访问地址:/?m=article&a=view&1=6  rewrite成静态化的真实地址 /article_view_6.html
这样,所有的链接都使用的是/article_view_6.html 第一次执行,用的是rewrite,然后生成了article_view_6.html这个文件,第二次访问。apache就直接使用article_view_6.html这个静态页面了

下面自己写的一个.htaccess文件,主要的作用就是rewrite静态化,如果html文件存在,则直接用,不使用伪静态(不执行php),后台如果对文章、首页或是列表页做了更改,只需把相应的html文件删除就行了,无需重新生成。

 

PHP代码
  1. <IfModule mod_rewrite.c>   
  2. RewriteEngine on   
  3. #rewrite规则   
  4. RewriteCond %{REQUEST_FILENAME} !-d   
  5. RewriteCond %{REQUEST_FILENAME} !-f   
  6. RewriteRule ^article_view_([0-9]+).html$ ?m=article&a=view&1=$1 [L]   
  7.   
  8. #去掉index.php  框架中需要使用   
  9. RewriteCond %{REQUEST_FILENAME} !-d   
  10. RewriteCond %{REQUEST_FILENAME} !-f   
  11. RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]   
  12.   
  13. </IfModule>   
  14.   

 

生成静态化类

PHP代码
  1. <?php   
  2. class html   
  3. {   
  4.     public function __construct()   
  5.     {   
  6.         ob_start();   
  7.     }   
  8.   
  9.     public function autoMkdir($file){   
  10.         $f=explode("/",$file);   
  11.         $dir=array();   
  12.         $alldir=;   
  13.         if(count($f)>0){   
  14.             foreach($f as $v){   
  15.                 if(!emptyempty($v) && strpos($v,‘.’)===false) $dir[]=$v;   
  16.             }   
  17.             for($i=0;$i<count($dir);$i++){   
  18.                 $alldir.=emptyempty($alldir)?$dir[$i]:‘/’.$dir[$i];   
  19.                 if(!is_dir($alldir)){   
  20.                     if(!@mkdir($alldir)){   
  21.                         throw new Exception(‘新建文件夹目录出错,请检查文件夹读写权限. ‘.$alldir);   
  22.                     }   
  23.                 }   
  24.             }   
  25.         }   
  26.     }   
  27.   
  28.     public function writehtml()   
  29.     {   
  30.         $file=$_SERVER[‘REQUEST_URI’];   
  31.         if(substr($file,-5)!=‘.html’return ;   
  32.         $file=substr($file,1);   
  33.         if(!file_exists($file)){   
  34.             $this->autoMkdir($file);   
  35.             $content = ob_get_contents();   
  36.             if(!@file_put_contents($file,$content)){   
  37.                 throw new Exception(‘写入html静态文件出错,请检查文件夹读写权限. ‘.$file);   
  38.             }   
  39.         }   
  40.     }   
  41. }   
  42. ?>  

 

使用方法:

 

PHP代码
  1. <?php   
  2. require_once("html.class.php");   
  3. $html=new html();   
  4. /*  
  5. 这里是执行php文件。  
  6. */  
  7.   
  8. //成生html文件,应该本句应放最后一行。   
  9. $html->writehtml();   
  10. ?>  

 

qq截图未命名.png