zoukankan      html  css  js  c++  java
  • PHP 实现页面静态化

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

    静态html文件执行顺序:运行

    动态程序:

                   连接数据库服务器或者缓存服务器->获取数据->填充到模板->呈现给用户

    关于优化页面响应时间

    •   动态页面静态化
    •   优化数据库
    •   使用负载均衡
    •   使用缓存

    1.  动态页面静态化:页面中一些内容不经常改动

            不适用于内容经常变换的应用:例如:微博等。如果页面中一些内容改动,动态页面静态化是非常有效的加速方法。

       动态页面静态化好处:

    • 减少服务器脚本的计算时间
    • 降低服务器的响应时间

    2.  动态URL地址设置静态形式(伪静态)

    3.  php静态化: 1.纯静态:

                                 a. 局部纯静态  

                                 b. 全部纯静态

                              2. 伪静态

    4.Buffer认知(php.ini文件中output_buffering=on开启缓存区,ob_start()也可以开启缓存区)

     a) Buffer其实就是缓冲区,一个内存地址空间,主要用于数据存储区域。

     b)输出流程:内容-》php buffer->tcp->终端

     c)获取缓冲区内容:php内容函数 ob_get_contents();

     d)ob_start():开启缓冲区(php5.3默认开启output_buffering=on)

    5.php如何实现页面纯静态化

      a)基本方式

            i.file_put_contents()函数:将一个字符串写入文件

                     file_put_contents(“文件名”,”文件内容”);

             ii.使用PHP内置缓存机制实现页面静态化-output_buffering

                    OB函数

          a) ob_start  :打开输出控制缓冲

          b) ob_get_contents:返回输出缓冲区内容

                     c) ob_clean:清空(擦掉)输出缓冲区

                     d) ob_get_clean:得到当前缓冲区的内容并删除当前输出缓冲区

    <?php 
    ob_start();
    echo 1234;
    file_put_contents('index.shtml',ob_get_contents());
    ?>
    

    在浏览器(终端)输出1234;index.shtml内容是:1234

    <?php
    ob_start();
    echo 1234;
    file_put_contents('index.shtml',ob_get_contents);
    ob_clean();
    ?>

    浏览器终端不会再有1234输出,静态页面index.shtml输出依旧是1234。理解php输出流程:内容->php buffer->tcp->终端, ob_clean();

    <?php
    ob_start();
    echo 456789;
    file_put_contents('index.shtml',ob_get_clean());
    ?>

    浏览器终端无输出,静态文件index.shtml内容是:456789,ob_get_clean()相当于ob_get_contents()和ob_clean()两个的作用。

     b)纯静态化案例之步骤解析

                 i.  链接数据库,然后从数据库里面获取数据

                 ii. 把获取的数据填充到模板文件里面

                 iii.  需要把动态的页面转化为静态页面,生成纯静态化文件

    <?php
    require_once('./db.php');
    
    $connect=Db::getInstance()->connect();
    $sql="select * from news limit 5":
    $result=mysql_query($sql,$connect);
    $news=array();
    while($row=mysql_fetch_array($result)){
      $news[]=$row;
    }
    //开启缓存区
    ob_start();
    //引入模板文件
    require_once(./templates/abc.php);
    
    if(file_put_contents('index.shtml',ob_get_clean())){
     echo 'success';
    }else{
     echo 'error';
    }
    ?>

    模板文件使用$news:abc.php

    <ul>
    <?php foreach($news as $k=>$v)?>
    <li><a href="/" target="_blank"><?php echo $v["title"];?></a></li>
    <?php } ?>
    </ul>

    6.如何触发系统生成纯静态化页面

    1.  页面添加缓存时间
    2.  手动触发方式
    3.  crontab定时扫描程序

    页面添加缓存时间:

      

    <?php
    //filemtime():获得文件修改时间
    if(is_file(./index.shtml)&&(time()-filemtime('./index.shtml'))<300){
    require_once('./index.shtml');
    }else{
    require_once('./db.php');
    
    $connect=Db::getInstance()->connect();
    $sql="select * from news limit 5":
    $result=mysql_query($sql,$connect);
    $news=array();
    while($row=mysql_fetch_array($result)){
      $news[]=$row;
    }
    //开启缓存区
    ob_start();
    //引入模板文件
    require_once(./templates/abc.php);
    
    file_put_contents('index.shtml',ob_get_contents());
    }
    ?>

    手动触发方式:后台开发一个功能:更新模块生成html静态页面(按钮)

    crontab定时扫描程序(linux系统):Linux服务器一个工具

             i.  设置crontab只需要执行一个命令*/5****php/data/static/index.php(每5分钟去执行一个程序)

    局部动态化案例实现

         a)静态化页面中如何想加载动态的内容如何处理?

              Ajax技术:jquery中ajax请求方式$.ajax()

             实现步骤:编写接口-》ajax请求接口操作

             接口数据:1.获取数据

                           2. 把我们获取到的数据组装成接口数据通信

    <?php
    //接口数据
    //1.获取数据
    //2.把我们获取到的数据组装成接口数据通信
    require_once("../db.php");
    $connect=Db::getInstance()->connect();
    $sql="select * from news limit 5";
    $result=mysql_query($sql,$connect);
    while($row=mysql_fetch_assoc($result)){
      $res[]=$row;
    }
    return show(1,'success',$res);
    function show($code=0,$message="error",$data=array()){
      $result=array(
        'code'=>$code,
       'message'=>$message,
      'data'=>$data,
      );
    echo json_encode($result);
    }
    ?>

    模板页abc.php引入ajax文件代码:

    code=1是数据返回成功

    $.ajax({
        url:"http://abc.com/api/hot.php",
       type:'get',
       dataType:'json',
       error:function(){
       },
      success:function(result){
         if(result.code==1){
           html='';
           $each(result.data,function(key,value){
               
                  html+='<li><a href="/">'+value.title+'</a></li>';
            }) ;
           $("#hot_html").html(html);
         }else{
          //todo
          }
       }
    });

    伪静态

    a)php处理伪静态(php的正则表达式方式)

        i.(Apache服务器)案例分析(path_info模式)print_r($_SERVER)查看path_info   /newsList.php/2/1.html

           备注:nginx服务器默认情况下不支持path_info模式,需要配置

    1. 通过正则表达式去分析伪静态URL地址:http://state.com/newsList.php/2/1.html
    2. print_r($_SERVER);获得header信息中的PATH_INFO:/2/1.html

      

    <?php
    /*
    通过正则表达式去分析伪静态URL地址
    
    http://abc.com/newList.php?type=2&category_id=1
    
    http//abc.com/newList.php/2/1.html
     2 => type=2    1 => category_id=1
    */
    //    /2/1.html
    if(preg_match('/^/(d+)/(d+).html'.$_SERVER['PATH_INFO'],$arr)){
        $type=$arr[1];
        $category_id=$arr[2];
    }else{
      //TODO
    }
    ?>

     ii.WEB服务器rewrite配置达到伪静态

           apache下rewrite配置

          1.Http.conf文件中开启相关模式

    1. (apacheApache2.2.11confhttpd.conf,去掉前面的#

                   LoadModule rewrite_module modules/mod_rewrite.so

          

    通过phpinfo();设置是否开启成功:

      Include conf/extra/httpd-vhosts.conf

    ii. vhosts文件增加相关域名

        Httpd_vhosts.conf配置文件配置相关信息

    1. VirtualHost节里面的信息
    2. 绑定域名:

       

       iii. 伪静态配置案例

             RewriteEngine on  //开启rewrite引擎

             RewriteRule^/detail/([0-9]*).html$/detail.php?id=$1   //设置的一个伪静态规则

            state.com/detail/134.html     state.com/detail.php?id=134

    当服务器项目中存在这个目录或者这个文件,就去访问。否则去访问伪静态文件。

     

    Nginx下rewrite配置

  • 相关阅读:
    给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组以及删除了重复条目的原数组。
    mysql批量替换某个字段的值!
    LInux常用命令
    盒模型布局
    box-sizing -- 盒模型
    vue中使用svg字体图标
    字体图标
    在线字体
    Java QQ邮箱发送邮件
    Java 对全局用户是否登录验证
  • 原文地址:https://www.cnblogs.com/Ann-wxp/p/4619178.html
Copyright © 2011-2022 走看看