巧用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文件删除就行了,无需重新生成。
<IfModule mod_rewrite.c>
RewriteEngine on
#rewrite规则
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^article_view_([0-9]+).html$ ?m=article&a=view&1=$1 [L]
#去掉index.php 框架中需要使用
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
#rewrite规则
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^article_view_([0-9]+).html$ ?m=article&a=view&1=$1 [L]
#去掉index.php 框架中需要使用
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
生成静态化类
<?php
class html
{
public function __construct()
{
ob_start();
}
public function autoMkdir($file){
$f=explode("/",$file);
$dir=array();
$alldir='';
if(count($f)>0){
foreach($f as $v){
if(!emptyempty($v) && strpos($v,'.')===false) $dir[]=$v;
}
for($i=0;$i<count($dir);$i++){
$alldir.=emptyempty($alldir)?$dir[$i]:'/'.$dir[$i];
if(!is_dir($alldir)){
if(!@mkdir($alldir)){
throw new Exception('新建文件夹目录出错,请检查文件夹读写权限. '.$alldir);
}
}
}
}
}
public function writehtml()
{
$file=$_SERVER['REQUEST_URI'];
if(substr($file,-5)!='.html') return '';
$file=substr($file,1);
if(!file_exists($file)){
$this->autoMkdir($file);
$content = ob_get_contents();
if(!@file_put_contents($file,$content)){
throw new Exception('写入html静态文件出错,请检查文件夹读写权限. '.$file);
}
}
}
}
?>
使用方法:
<?php
require_once("html.class.php");
$html=new html();
/*
这里是执行php文件。
*/
//成生html文件,应该本句应放最后一行。
$html->writehtml();
?>
原文:http://www.phpd.cn/show-204-1.html
- 没有相关文章
- 没有评论