首頁  >  文章  >  後端開發  >  PHP頁面靜態化之純靜態與偽靜態用法詳解

PHP頁面靜態化之純靜態與偽靜態用法詳解

coldplay.xixi
coldplay.xixi轉載
2020-07-14 17:16:273386瀏覽

PHP頁面靜態化之純靜態與偽靜態用法詳解

本文實例敘述了PHP頁面靜態化之純靜態與偽靜態用法。分享給大家供大家參考,具體如下:

為什麼要靜態化頁面?

       當使用者存取一個不常更新的Web頁面,PHP接到指示對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[&#39;db_host&#39;], $options[&#39;db_user&#39;], $options[&#39;db_password&#39;], $options[&#39;db_database&#39;]);
  }

  //负责实例化数据库类,返回实例化后的对象
  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(&#39;shtml/index.shtml&#39;) && (time() - filemtime(&#39;shtml/index.shtml&#39;) < 300)) {
      require_once (&#39;index.shtml&#39;);
    }else {
      require_once (&#39;Database.php&#39;);
      $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 &#39;Message: &#39; .$e->getMessage();
      }
      //开启缓存区,这后面的内容都会进缓存区
      ob_start();
      //引入模板文件(模板会渲染数据)
      require_once (&#39;templates/index.php&#39;);
      //取出缓存区内容(在这里是渲染后的模板),将其保存(默认会覆盖原来的)为index.shtml(static html)
      file_put_contents(&#39;shtml/index.shtml&#39;, ob_get_contents());
    }
  }
}
//数据库配置信息
$options = [
  &#39;db_host&#39; => &#39;mysql&#39;,
  &#39;db_user&#39; => &#39;root&#39;,
  &#39;db_password&#39; => &#39;localhost&#39;,
  &#39;db_database&#39; => &#39;pro_shop&#39;,
];
$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) {?>
<p>姓名:<?php echo $item[1]?></p>
<p>密码:<?php echo $item[2]?></p>
<?php }?>
</body>
</html>

瀏覽器存取localhost/Cache.php

以上是PHP頁面靜態化之純靜態與偽靜態用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除