文档章节

ThinkPHP5中如何实现模板完全静态化

北桥苏
 北桥苏
发布于 10/10 19:32
字数 959
阅读 65
收藏 0

    模板完全静态化,也就是通过模板完全生成纯静态的网页,相比动态页面和伪静态页面更安全更利于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就可以生成一个完整的静态页面了。

 

© 著作权归作者所有

北桥苏
粉丝 9
博文 113
码字总数 73609
作品 0
深圳
程序员
私信 提问
ThinkPHP5.0.0 RC1版本发布——为API开发而设计

ThinkPHP V5.0——为API开发而设计的高性能框架 经过一段时间的测试和完善,官方正式发布第一个RC版本,该版本功能趋于稳定。 ThinkPHP5.0版本是一个颠覆和重构版本,基于PHP5.4设计(支持P...

流年
2016/01/30
2.7K
21
wemall 7.0 开源系统发布,支持公众号和小程序开发

wemall7.0 开源系统,基于thinkphp5开发,支持composer,优化核心,减少依赖,基于全新的架构思想和命名空间。 wemall7.0特性: 基于TP5,性能优越 前后分离,简单方便 插件扩展,功能丰富 ...

einsqing
2017/05/03
1K
7
einsqing/wemall

WeMall商城 7.0 (不含商城) wemall7.0 开源系统,基于thinkphp5开发,支持composer,优化核心,减少依赖,基于全新的架构思想和命名空间。 thinkphp5.0特性 基于命名空间和众多PHP新特性 核心...

einsqing
2014/05/24
0
0
ThinkPHP 5.0.2 版本发布,1024 程序员节的祝福

ThinkPHP V5.0.2版本发布,祝TPer程序员节快乐,事业顺利,身体健康^_^ ThinkPHP V5.0——为API开发而设计的高性能框架 V5.0版本由七牛云独家赞助发布 ThinkPHP5.0版本是一个颠覆和重构版本,...

流年
2016/10/24
3.2K
36
OneBase V1.3.1 发布,基于 ThinkPHP5 的开源架构系统

OneBase V1.3.1 已发布,更新内容如下: 安装模块优化,修复不存在数据库时异常 各模块入口归一,优化各种环境下静态资源路径问题,支持多层嵌套根目录结构。 手册地址调整,配置文件优化 行...

Bigotry
2018/03/16
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Andorid SQLite数据库开发基础教程(2)

Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库。...

大学霸
22分钟前
3
0
YecPad 开源啦!: 基于C#的功能强大的可编辑记事本文本编辑软件

JY Lin 开源:YecPad : 基于C#的功能强大的可编辑记事本文本编辑软件 YecPad 是一款基于C#编程语言开发的功能强大的可编辑记事本文本编辑软件。 可以进行文本文件的打开、保存、删除及编辑功...

YDOOK
30分钟前
3
0
StringBuilder 与 StringBuffer 的区别

StringBuffer是线性安全的,支持并发操作,适合多线程。 StringBuilder线性不安全,不支持并发操作,适合单线程。 也就是说他们俩区别就在于支不支持并发操作,使用上基本上类似...

无名氏的程序员
32分钟前
3
0
js 找数组中的最值

本文转载于:专业的前端网站➸js 找数组中的最值 背景: 2个数组以下 , 比如 [[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]] 找最值的时候,我一开始想用两个...

前端老手
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部