您现在的位置是:网站首页 > 心得笔记

PHP页面静态化

盛悦2019-02-26528人围观
简介使用场景:如果页面中有一些内容不经常改动,动态页面静态化是非常有效的加速方法。

1、页面的分类

1.1、动态压面:当我们加载页面时 它会首先去执行动态文件中的动态程序,这些动态程序主要有jsp asp php等

动态文件执行阶段:语法分析-》编译-》运行

1.2、静态页面:其实就是一个全静态的html文件  这个文件里的程序都是以html的语言格式呈现的

静态文件执行阶段:直接运行

2、如何优化页面响应时间

2.1、动态页面静态化(这里主要讲解的是动态页面静态化)

2.2、优化数据库

2.3、使用负载均衡

2.4、使用缓存

3、动态页面静态化:

3.1、使用场景:

如果页面中有一些内容不经常改动,动态页面静态化是非常有效的加速方法。比如新浪首页www.sina.com.cn 它实际执行的首页文件就是index.shtml

微信图片_20190226104745.png

3.2、实质:

生成静态的html文件

3.3、好处:

1、减少服务器脚本的计算时间

2、降低服务器的响应时间


为什么可以降低服务器的响应时间?

1.1、因为动态文件执行过程是:语法分析-》编译-》运行;静态文件执行过程直接就是运行。从这方面来说,可以减少一部分时间

1.2、动态程序获取动态内容,需要链接数据库服务器 或者缓存服务器 还会从服务器中获取数据  然后把数据填充到相应的模板之中 最后呈现给用户;静态文件直接把生成好的静态文件展示出来


说明:动态页面静态化不适用于内容经常改变的引用,比如:微博 (基本以每秒更新数计算)


4、关于动态url地址设置静态形式

动态url地址:https://www.blog.blonglee.me/act?orgId=2212&orgName=yahan

静态url地址:https://www.blog.blonglee.me/yahan-act-2212.html

问题1:是不是我把动态地址转化为静态地址后,再去访问静态地址这个页面,它呈现的内容就是静态页面呢?

答案1:加载的内容不是静态页面。转换静态地址之后,他的根还在动态页面  加载之后还是动态页面的形式

问题2:动态地址怎么转静态地址?

答案2:是通过服务器配置的

把动态url转换为静态url的过程,称之为“伪静态”!


5、静态化介绍

纯静态:它其实就是纯净态的html文件 他是通过PHP程序去生成的静态html文件 前端访问时 其实是去加载我们生成好的html文件

局部纯净态:也可以理解为局部动态化  如果静态化页面中存在局部动态化的内容,就称为局部纯静态

比如说新浪体育台下的数据就是动态数据。这块数据使用ajax从服务器获取数据 再通过js将数据填充到页面中

微信图片_20190226111309.png


伪静态:其实就是把我们动态页面url地址转化为静态页面的url地址,需要服务器配置


6、纯静态化案例实现

6.1、buffer的认知

PHP生成纯静态化页面是围绕buffer来进行讲解的

buffer就是一个缓冲区,一个内存地址空间 主要用来存储数据

ob_start();开启PHP缓冲区

ob_get_contents();获取PHP缓冲区内容


6.2、PHP如何实现页面纯静态化

基本方式:

1、file_put_contents($filename, $data)函数  把相关内容写到文件里  返回数据:成功返回写入文件字节数  失败返回false

2、使用PHP内置缓冲区机制实现页面静态化 —— output_buffering(具体配置在PHP.ini中)  PHP对output_buffering有几个内置函数ob_操作缓存区的函数

这里主要讲解以下几个:

ob_start();—— 打开输出缓冲区 (执行PHP输出时,数据都是先经过缓冲区 再输出来)

ob_get_contents();—— 返回输出缓冲区的内容

ob_clean();—— 清空输出缓冲区

ob_get_clean();—— 得到当前缓冲区的内容并删除当前输出缓冲区(效果相当于前两个函数)


6.3、纯静态化案例实现

PHP实现纯静态化的最终目的是生成一个纯静态的html页面存放在磁盘!

步骤:

步骤一:连接数据库,从数据库中查询数据

步骤二:把获取到的数据填充到模板文件

步骤三:需要把动态的页面转为静态页面——生成纯静态化文件

laravel框架中生成静态页面代码实例(我这里是在本地环境下测试的):

/**
     * 笔记页面展示
     * @author Sheng Yue
     * @time 2018/11/23
     */
    public function index (Note $note)
    {
        //1、查询数据
        $list = $note->getNoteList();
        
        //2、将数据填充到html页面
        $htmlStrings = view('front.notes.index')->with('list',$list)->__toString();//注意:获取页面通常用curl
        
        //3、生成静态页面
        $path = public_path().'\\'.'html\\notes';//定义存放静态页面路径
                $result = self::create_dir($path);//创建路径文件
                if ($result) {
                    $this->create_static_page($path, 'note-static.html', $htmlStrings);//写入文件 生成静态页面
                    View::addExtension('html', 'php');//扩展名
                    echo view()->file($path.'\\'."note-static.html")->render();//注意:这里使用view()不能抛出异常 所以需要使用render()抛出异常
                }
    }

    //获取到的页面内容写入到指定文件中 文件路径  文件名 写入文件内容
    public function create_static_page ($path, $filename, $content) {
          file_put_contents($path.'/'.$filename, $content);
    }

    //创建目录
    public static function create_dir ($path) {
        return is_dir($path) or (self::create_dir(dirname($path)) and mkdir($path, 0777));
    }


执行代码 后 可见,已经生成静态页面note-index.html了!这说明成功了

g4(1).png


6.4、如何触发系统生成纯静态化页面

1、页面添加缓存时间

微信图片_20190227092422(1).png



这时候代码如下:

/**
     * 笔记页面展示
     * @author Sheng Yue
     * @time 2018/11/23
     */
    public function index (Note $note)
    {
        $path = public_path().'\\'.'html\\notes';
        if (is_file($path."\\". "note-static.html") && (time() - filemtime($path."\\". "note-static.html")) < 300) {
            View::addExtension('html', 'php');//扩展名
            echo view()->file($path.'\\'."note-static.html")->render();
        } else {
            $path = public_path().'\\'.'html\\notes';//定义存放静态页面路径
            $result = self::create_dir($path);//创建路径文件
            $list = $note->getNoteList();
            $htmlStrings = view('front.notes.index')->with('list',$list)->__toString();//注意:获取页面通常用curl
            if ($result) {
                $this->create_static_page($path, 'note-static.html', $htmlStrings);//写入文件 生成静态页面
                View::addExtension('html', 'php');//扩展名
                echo view()->file($path.'\\'."note-static.html")->render();
            }
        }
    }

    //创建存放静态页面的文件夹
    public static function create_dir ($path) {
        return is_dir($path) or (self::create_dir(dirname($path)) and mkdir($path, 0777));
    }
    //生成静态文件
    public function create_static_page ($path="", $filename="", $content="") {
        file_put_contents($path.'/'.$filename, $content);
    }


2、手动触发方式

1w(1).png

当后台管理员点击开始更新时,就是重新生成静态页面!链接数据库-》请求数据-》填充到页面中-》生成静态页面,没有了哪些判断。直接从数据库中查询最新的数据

3、crontab定时扫描时间


7、局部动态化案例实现

静态页面中想加载动态的内容就需要用到局部动态化,需要用到ajax技术。

举例说明:有很多页面都有这样的加载效果。开始加载一部分页面  当鼠标移到页面底部后 会继续ajax请求数据并填充到页面上

jquery中ajax请求方式

$.ajax({    url:'',   type:'get/post',   dataType:'json',   error:function(){            },   success:function(result){            },})

实现步骤:

步骤一:编写接口

步骤二:ajax请求接口数据 请求成功后,将数据拼成需要的格式动态塞到页面中


8、伪静态

8.1、定义:伪静态就是把动态的url地址转换为类似于静态的url地址   我们通过伪静态的url地址访问的页面 其实还是一个动态页面

8.2、设计成伪静态原因:

1、 url没挂

2、让百度谷歌等浏览器收录

8.3、PHP方式处理伪静态(正则表达式)