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


Posted in PHP onJune 05, 2020

本文实例讲述了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

<?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

<?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

<!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页面静态化――纯静态与伪静态用法详解

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

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

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

PHP 相关文章推荐
从C/C++迁移到PHP——判断字符类型的函数
Oct 09 PHP
PHP 页面编码声明方法详解(header或meta)
Mar 12 PHP
通俗易懂的php防注入代码
Apr 07 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
PHP中Socket连接及读写数据超时问题分析
Jul 19 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
php引用传递
Apr 01 PHP
PHP预定义接口――Iterator用法示例
Jun 05 #PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
Jun 05 #PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 #PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 #PHP
如何在PHP中生成随机数
Jun 04 #PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 #PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 #PHP
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php验证码实现代码(3种)
2015/09/07 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
MooTools 1.2介绍
2009/09/14 Javascript
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
python抽象基类用法实例分析
2015/06/04 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
django中模板的html自动转意方法
2018/05/27 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
基于Python的OCR实现示例
2020/04/03 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
列车长先进事迹材料
2014/01/25 职场文书
大学社团活动策划书
2014/01/26 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers