当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-08 10:54:26 浏览: 评论: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. <?php 
  2.  
  3. class Database { 
  4.  
  5.   //用于保存实例化对象 
  6.  
  7.   private static $instance
  8.  
  9.   //用于保存数据库句柄 
  10.  
  11.   private $db = null; 
  12.  
  13.  
  14.  
  15.   //禁止直接实例化,负责数据库连接,将数据库连接句柄保存至私有变量$db 
  16.  
  17.   private function __construct($options) { 
  18.  
  19.     $this->db = mysqli_connect($options['db_host'], $options['db_user'], $options['db_password'], $options['db_database']); 
  20.  
  21.   } 
  22.  
  23.  
  24.  
  25.   //负责实例化数据库类,返回实例化后的对象 
  26.  
  27.   public static function getInstance($options) { 
  28.  
  29.     if (!(self::$instance instanceof self)) { 
  30.  
  31.       self::$instance = new self($options); 
  32.  
  33.     } 
  34.  
  35.     return self::$instance
  36.  
  37.   } 
  38.  
  39.  
  40.  
  41.   //获取数据库连接句柄 
  42.  
  43.   public function db() { 
  44.  
  45.     return $this->db; 
  46.  
  47.   } 
  48.  
  49.  
  50.  
  51.   //禁止克隆 
  52.  
  53.   private function __clone() { 
  54.  
  55.     // TODO: Implement __clone() method. 
  56.  
  57.   } 
  58.  
  59.  
  60.  
  61.   //禁止重构 
  62.  
  63.   private function __wakeup() { 
  64.  
  65.     // TODO: Implement __wakeup() method. 
  66.  
  67.   } 
  68.  

用于静态化页面

Cache.php

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

template/index.php

  1. <!DOCTYPE> 
  2.  
  3. <html> 
  4.  
  5. <head> 
  6.  
  7.   <meta charset="UTF-8"
  8.  
  9.   <title>首页</title> 
  10.  
  11. </head> 
  12.  
  13. <body> 
  14.  
  15. <?php foreach ($res as $item) {?> 
  16.  
  17. <p>姓名:<?php echo $item[1]?></p> 
  18.  
  19. <p>密码:<?php echo $item[2]?></p> 
  20.  
  21. <?php }?> 
  22.  
  23. </body> 
  24.  
  25. </html> 

浏览器访问 localhost/Cache.php

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

Tags: PHP页面静态化 PHP伪静态

分享到: