1. 程式人生 > >PHP靜態化技術之真靜態

PHP靜態化技術之真靜態

PHP靜態化技術分為兩種:真靜態技術 和偽靜態技術。

什麼是真靜態技術?我們把.html檔案稱為靜態檔案。所以,真靜態技術就是生成靜態檔案的技術。
在討論PHP生成靜態檔案的技術之前,需要弄明白一點。這個技術針對的需求和使用的地方在哪裡?
筆者在這個地方很是苦惱了一番。我們知道一個網站,通常來講會有前臺和後臺之分,也就是給client看的部分和管理給client看的部分。
給client 看的部分可以是一個靜態的.html檔案也可以是一個動態的.php檔案。如果是一個.php檔案,需要PHP模組去解析執行,如果涉及到
的資料需要從資料庫獲取的話,還要訪問資料庫。這在高併發以及大流量的網站,會對伺服器的效能和資料庫形成很大的壓力。因此使用靜態檔案的話,
不僅可以提高訪問的速度,還能降低成本。


(當我們把生成靜態檔案的程式碼放置到後臺中,前臺只需要放置對應的html檔案即可。這樣做,天然的實現了使用者訪問網站時,只能看到html檔案的功能)


事實上如何生成一個html檔案的方式有很多,這裡只說明比較熟悉的兩種方式。一種是基於ob output control輸出快取控制和PHP檔案系統函式。另一種則是模板替換技術。


1.基於ob的生成靜態html檔案的方法。


<? 
ob_start(); 
echo "<html>". 
"<head>". 
"<title>PHP網站靜態化教程</title>". 
"</head>". 
"<body>歡迎訪問指令碼之家,本文主要介紹PHP網站頁面靜態化的方法</body>". 
"</html>"; 
$out1 = ob_get_contents(); 
ob_end_clean(); 
$fp = fopen("leapsoulcn.html","w"); 
if(!$fp) 

echo "System Error"; 
exit(); 

else

fwrite($fp,$out1); 
fclose($fp); 
echo "Success"; 

?>
//這段程式碼展示了ob函式的基本使用方式。在實際的應用中會比這個複雜的多。


2.模板替換技術。首先編寫一個模板,這裡模板為顯示一篇文章的模板。
Page.tpl
<html>
<head>
<meta  charset="utf-8">
<title>%title%</title>
</head>
<body>
  <h3>%title%</h3>
  <hr>
  <div class="content">
       %content%
  </div>
</body>
</html>


action.php  模板替換實現
<?php
       //從資料庫獲取資料的程式碼省略
      $data = array("id"=>"1",'titile'=>"page_title","content"=>"page_content");
      $html_filename = "page_".$data['id'].".html" ;
      $html_fp = fopen($html_filename,'w'); //開啟該html檔案,以便於後面寫入資料
      $tpl = fopen("Page.tpl",'r'); //讀取模板檔案
      while(!feof($fp)){
             $row = fgets($fp);
             $row = str_replace("%title%",$data['title']);   //把模板檔案中的佔位符有實際資料替換掉
             $row = str_replace("%content",$data['content']);  
             fwrite($html_fp,$row);
      }
      fclose($html_fp);
      fclose($fp);
      //至此,html檔案已經生成。可以在其它頁面根據既定的規律來連線到該檔案。 實際的模板替換可能比例子複雜的多。


PHP模板實現靜態化非常方便,比如安裝和使用PHP Smarty實現網站靜態化。
在使用Smarty的情況下,也可以實現頁面靜態化。下面先簡單說一下使用Smarty時通常動態讀取的做法。 
一般分這幾步:
1、通過URL傳遞一個引數(ID);
2、然後根據此ID查詢資料庫;
3、取得資料後根據需要修改顯示內容;
4、assign需要顯示的資料;
5、display模板檔案。
Smarty靜態化過程只需要在上述過程中新增兩個步驟。
第一:在1之前使用 ob_start() 開啟緩衝區。
第二:在5之後使用 ob_get_contents() 獲取記憶體未輸出內容,然後使用fwrite()將內容寫入目標html檔案


最後,討論下如何實現使用者在第一次訪問時生成靜態檔案以及設定檔案過期時間的思路。
要實現這點,首先訪問的檔案就不能是html 檔案,而只能是php檔案。在其中新增判斷。當前請求的
html 檔案是否存在以及檔案的生成時間和當前系統時間對比,是否有超過規定的過期時間如30s. 如果超過
就執行動態程式碼並重新生成該靜態檔案,否則讀取存在的靜態檔案並返回即可。