當我們在訪問各個門戶信息網站時,主頁都會給我們顯示各種頭條、導航信息(例如新聞網)。我們可以想象,面對衆多的數據庫訪問等操作,在我們訪問這些網頁的同時加載速度將會變得很慢。衆所周知,咱在訪問靜態頁面的速度是優於動態網頁的。所以,實現頁面靜態化可以有效地解決這些問題。
那麼,何爲靜態化?其實根據字面理解我們可以得知,靜態化就是將一個動態的網頁轉變成一個類似靜態的網頁。動態頁面靜態化的實質就是:生成靜態的HTML文件。
靜態化需要用到兩個關鍵的知識點:
①buffer緩衝區機制
②利用函數file_put_contents()寫入文件
靜態化的過程:
1、PHP模板頁面(與將要展示的HTML頁面一致,區別在於添加了PHP代碼)
2、寫入靜態文件並生成HTML文件(從緩衝區中提取模板文件)
首先我們要先寫一個操作類,用於操作模板和生成靜態HTML文件:
operation.php:
$dsn = 'mysql:dbname=chatroom;host=127.0.0.1'; $user = 'root';$password = '123456'; $pdo = new PDO($dsn, $user, $password); $sql="SELECT * FROM messages limit 3"; $stmt = $pdo->prepare($sql); $result = $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_ASSOC); //以關聯數組的形式返回結果 $rows = $stmt->fetchAll(); ob_start(); //打開緩衝區 require_once('muban.php');
代碼解讀:首先從數據庫中讀取數據,然後引入'muban.php'文件,目的是讓其在引入的過程中加入到緩衝區中。
根據流程步驟:
1、PHP模板頁面
爲了演示方便,簡單寫了一個界面,如下所示:
muban.php
<body> <div id="wrap"> <h1>本月最熱主播排行榜</h1> <ul id="ulm"> <?php require_once('operation.php'); foreach($rows as $row){?> <li>名稱:<?php echo $row['user']?> 收到禮物數量: <?php echo $row['msg']?></li><hr/> <?php }?> </ul> </div> </body>
代碼解讀:遍歷'operation.php'文件中的'$rows'數組,將結果輸出到<li>標籤中。
2、寫入靜態文件並生成HTML文件(從緩衝區中提取模板文件)
在operation.php中後續加上以下代碼:
if(file_put_contents('index.html',ob_get_clean())){ echo "success"; }else{ echo "false"; }
利用'file_put_contents()'方法將緩衝區中的內容寫入到'index.html'文件中去,完成了靜態文件的生成。ob_get_clean()方法是從緩衝區中讀取數據並且清除緩衝區(清除緩衝區也可以理解爲加載本函數內容不會顯示在終端)
最終生成了'index.html'界面:
從控制檯可以看到加載響應的時間爲:
我們再看看muban.php頁面:
之前說過生成的html靜態文件是根據模板界面來生成的,所以界面是一樣的。再看看加載的相應時間:
從響應的時間我們可以看出,僅僅只有幾行代碼就產生了這麼大的差距。可想而知,當網頁信息量十分龐大的時候,對加載響應的速度影響非常大。利用頁面靜態化,從而可以極大地避免這樣的問題出現。
-----------------------------------------------------------------------------------------
說到生成靜態文件,如果網頁信息有變化,那該怎麼辦呢?答案就是重新生成(這不廢話嗎?)
自動觸發系統生成靜態化頁面有三種常見的方式:
1、頁面添加緩存時間。當用戶請求頁面時,後臺判定頁面時間是否過期(超過了設置的緩存時間),如果超過了則生成新的靜態頁面;反之則獲取靜態頁面。
2、手動觸發生成。爲了解決頁面修改但是未能及時顯示的問題,後臺添加“一鍵更新”的按鈕實現點擊後生成靜態文件。
3、Crontab定時掃描程序。該方法涉及到Linux操作系統上的應用:
*/5**** php/data/StaticPage/operation.php
該語句意爲每5分鐘執行以下index.php文件。由於本人對其瞭解不深,就不做過多描述,以免誤人子弟。