PHP页面静态化——纯静态与伪静态用法详解

吾爱主题 阅读:160 2021-10-16 16:37:00 评论:0

本文实例讲述了PHP页面静态化——纯静态与伪静态用法。分享给大家供大家参考,具体如下:

为什么要静态化页面?

       当用户访问一个不经常更新的Web页面,PHP接到指示对php脚本文件进行解析,从数据库查询到该页面所需要的数据,然后对页面模板进行渲染,最后将一个成品页面展示给用户。单次请求对于服务器来说非常简单,处理起来非常快,但是如果同时有成千上万各用户请求该页面呢?这无疑是对资源的一种浪费,这就是我们要做静态的目的。

       静态化分为纯静态与伪静态,纯静态又分为局部纯静态和全部纯静态。

伪静态

       伪静态顾名思义,它并不是真的静态页面而是伪装的。例如一个以php作为后端语言的web站点,正常情况下他的url应当是类似于http://www.example.com/index.php,当我们做了伪静态处理后,当你访问同一个页面它展示的url可能就是http://www.example.com/index.html了。它的作用是路由简化,能够更好的被搜索引擎收录,当你不想让用户知道你的后端语言时也可以采用这种方法。这里设计到了路由与重定向知识,不做详解。

纯静态

  • 局部纯静态

       一个页面通常由多个部分组成,例如一个博客,他可能由正文、分类、友情链接、栏目等部分组成。当有些部分更新频繁,而有些部分不常更新时就可以采用局部静态化。

  • 全部纯静态

       看了前面的内容这个就很容易理解了,当一个页面所有内容都不常更新即采用这种方式。

静态化页面实现原理

        首先要说的是一个叫做缓冲器(buffer)的东西。举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘。对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示。
        这里我们就要对这个缓冲区做一下文章了,在php输出内容之前,我们取出缓冲区的内容(这里就是渲染好的模板内容了),然后将其写入一个静态文件中并设置过期时间,当下次用户访问该页面的时候,如果该静态文件存在并且在有效期内,我们就直接将该静态文件展示给用户看,否则重写静态文件。

代码实现

数据库连接,用到了单例模式。

Database.php

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <?php class Database {    //用于保存实例化对象    private static $instance ;    //用于保存数据库句柄    private $db = null;      //禁止直接实例化,负责数据库连接,将数据库连接句柄保存至私有变量$db    private function __construct( $options ) {      $this ->db = mysqli_connect( $options [ 'db_host' ], $options [ 'db_user' ], $options [ 'db_password' ], $options [ 'db_database' ]);    }      //负责实例化数据库类,返回实例化后的对象    public static function getInstance( $options ) {      if (!(self:: $instance instanceof self)) {        self:: $instance = new self( $options );      }      return self:: $instance ;    }      //获取数据库连接句柄    public function db() {      return $this ->db;    }      //禁止克隆    private function __clone() {      // TODO: Implement __clone() method.    }      //禁止重构    private function __wakeup() {      // TODO: Implement __wakeup() method.    } }

用于静态化页面

Cache.php

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?php class Cache {    public function index( $options ) {      //判断文件是否存在,判断是否过期      if ( is_file ( 'shtml/index.shtml' ) && (time() - filemtime ( 'shtml/index.shtml' ) < 300)) {        require_once ( 'index.shtml' );      } else {        require_once ( 'Database.php' );        $con = Database::getInstance( $options )->db();        $sql = "SELECT * FROM pro_test" ;        $exe_res = mysqli_query( $con , $sql );        $res = mysqli_fetch_all( $exe_res );        try {          if (! $res ) {            throw new Exception( "no result" );          }        } catch (Exception $e ) {          echo 'Message: ' . $e ->getMessage();        }        //开启缓存区,这后面的内容都会进缓存区        ob_start();        //引入模板文件(模板会渲染数据)        require_once ( 'templates/index.php' );        //取出缓存区内容(在这里是渲染后的模板),将其保存(默认会覆盖原来的)为index.shtml(static html)        file_put_contents ( 'shtml/index.shtml' , ob_get_contents());      }    } } //数据库配置信息 $options = [    'db_host' => 'mysql' ,    'db_user' => 'root' ,    'db_password' => 'localhost' ,    'db_database' => 'pro_shop' , ]; $obj = new Cache(); $obj ->index( $options );

template/index.php

?
1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE> <html> <head>    <meta charset= "UTF-8" >    <title>首页</title> </head> <body> <?php foreach ( $res as $item ) {?> <div>姓名:<?php echo $item [1]?></div> <div>密码:<?php echo $item [2]?></div> <?php }?> </body> </html>

浏览器访问 localhost/Cache.php

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://blog.csdn.net/Wenco1/article/details/85109535

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容