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 相关文章推荐
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php strrpos()与strripos()函数
Aug 31 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 PHP
PHP基于进程控制函数实现多线程
Dec 09 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
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
php实现微信企业转账功能
2018/10/02 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
iframe实用操作锦集
2014/04/22 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
Ionic快速安装教程
2016/06/03 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python通过select实现异步IO的方法
2015/06/04 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
浅析python的优势和不足之处
2018/11/20 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
职业生涯规划书前言
2014/04/15 职场文书
学习心理学的体会
2014/11/07 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
开除通知书范本
2015/04/25 职场文书