乐趣区

关于php:ThinkPHP5中如何实现模板完全静态化

模板齐全动态化,也就是通过模板齐全生成纯动态的网页,相比动静页面和伪动态页面更平安更利于 SEO 拜访更快。相比前二者各有利弊吧,当初略微对这三种模式的优缺点比照一下,以及在 ThinkPHP5 我的项目中实现齐全动态化的根本过程。

比照

1. 动静与真动态

页面动态化与动静页的比照,动态没有了 SQL 和一些后端脚本运行,平安稳固,访问速度快,对 SEO 敌对 (网上也有说当初的搜索引擎曾经对动静网页的抓取没什么压力了),然而搜索引擎再弱小,动态的 URL 也比动静的前面带问号冒号什么的要好看,不对 SEO 敌对对一般浏览用户者也是敌对(难看第一)。然而生成动态页面的弊病,也就是如果一个博客网站,随着文章内容的增多,那生成的页面也一直增多,就算一个 html 就 30 几 Kb,数量多的状况下也挺耗存储空间,网上也有说频繁生成动态页面化,容易让硬盘呈现坏道。这个我的认识是不好测试能够疏忽,因为当初少数是应用云服务器或云虚拟主机,那些都不是物理硬件,就算太过碎片导致硬盘损坏,网站也能失常拜访的,因为那是云服务器。

2. 真动态与伪动态

这二者的比照看起来像是正统之争,因为大家都晓得伪动态还是动静页,只是 Apache 通过 URL 重写规定让其变成了像动态网页的样子。次要也是让本人对 SEO 敌对,然而相比真动态多了 Apache 的步骤,所以也就比拟消耗一些服务器的资源。而真动态的毛病下面也说了,在我的项目中的抉择看需要,各有利弊,北桥苏的应用次要是本人网站有时要优化一下速度所以就做了模板动态化,以下是操作过程。

实现思路

1. 依据模块控制器主动递归创立目录

2. file_exists 判断生成的动态页是否存在

3. 或判断过期与否,存在重定向到动态网页

4. file_put_contents($file,$content) 函数生成页面

编码

1. 目录的创立

/*
 * 递归创立目录
 * @param string $dir 文件目录门路
 * @return boolean 创立后果
 * **/
function mkdirs($dir)
{if(!is_dir($dir))
    {if(!mkdirs(dirname($dir))){return false;}
        if(!mkdir($dir,0777)){return false;}
    }
    return true;
} 

2. 在基类中初始化需创立的目录

protected $staticHtmlDir = "";              // 动态模板生成目录
protected $staticHtmlFile = "";             // 动态文件


protected function _initialize() {parent::_initialize();

      $this->staticHtmlDir = "html".DS.$this->request->controller().DS;

3. 基类中的生成前与生成后的办法

// 判断是否存在动态
public function beforeBuild($param) {
        // 生成动态
        //$baseDir = "html".DS.$this->request->controller().DS;
        if(is_array($param)) {$param = implode("_",$param);
        }
        $this->staticHtmlFile = $this->staticHtmlDir.$this->request->action().($param?$param:'').'.html';

        if(mkdirs($this->staticHtmlDir)) {if(file_exists($this->staticHtmlFile) && filectime($this->staticHtmlFile)>=time()-60*60*24*5) {                  // 动态文件存在
                $this->redirect('/'.$this->staticHtmlFile);
            }
        }
    }

// 开始生成动态文件
public function afterBuild($html) {if(!empty($this->staticHtmlFile) && !empty($html)) {if(file_exists($this->staticHtmlFile)) {unlinnk($this->staticHtmlFile);
            }
            if(file_put_contents($this->staticHtmlFile,$html)) {$this->redirect('/'.$this->staticHtmlFile);
            }
        }
    }

4. 视图控制器中的应用

ThinkPHP5 中 fetch 办法返回给 file_put_contents 函数作为 content 就能够生成一个残缺的动态页面了。

 

退出移动版