以前用过或是写过的生成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代码
- <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代码
- <?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代码
- <?php
- require_once("html.class.php");
- $html=new html();
- /*
- 这里是执行php文件。
- */
- //成生html文件,应该本句应放最后一行。
- $html->writehtml();
- ?>