PHP靜態化頁面(轉載)

什麼是PHP靜態化

PHP靜態化的簡單理解就是使網站生成頁面以靜態HTML的形式展示在訪客面前,PHP靜態化分純靜態化和僞靜態化,二者的區別在於PHP生成靜態頁面的處理機制不一樣。php

將PHP的執行頁面預先轉換成HTML,是所謂的PHP靜態化方法之一。html

 



爲何要讓網頁靜態化

1、加快頁面打開瀏覽速度,靜態頁面無需鏈接數據庫打開速度較動態頁面有明顯提升;
2、有利於搜索引擎優化SEO,Baidu、Google都會優先收錄靜態頁面,不只被收錄的快還收錄的全;
3、減輕服務器負擔,瀏覽網頁無需調用系統數據庫;
4、網站更安全,HTML頁面不會受php相關漏洞的影響; 觀看一下大一點的網站基本全是靜態頁面,並且能夠減小攻擊,防sql注入。sql

靜態化的做用:數據庫

提升網站的響應速度,下降服務器的負載;
用於搜索引擎的SEO;
利用PHP輸出buffer直接寫成html,定時後臺定時掃一遍網站,是比較容易實現的網頁靜態化。瀏覽器


數據庫出錯時,不影響網站正常訪問。
生成html文章雖操做上麻煩些,程序上繁雜些,但爲了更利於搜索,爲了速度更快些,更安全,這些犧牲仍是值得的。

PHP生成靜態HTML頁面的方法

利用PHP模板生成靜態頁面

PHP模板實現靜態化很是方便,好比安裝和使用PHP Smarty實現網站靜態化,也能夠本身寫一套模板解析規則,常見的能夠模仿各種cms的模板規則。

1.使用PHP文件讀寫功能與ob緩存機制生成靜態頁面
好比某個商品的動態詳情頁地址是: http://xxx.com?goods.php?gid=112
那麼這裏咱們根據這個地址讀取一次這個詳情頁的內容,而後保存爲靜態頁,下次有人訪問這個商品詳情頁動態地址時,咱們能夠
直接把已生成好的對應靜態內容文件輸出出來。

緩存

 1 $gid = $_GET['gid']+0;//商品id
 2 $goods_statis_file = "goods_file_".$gid.".html";//對應靜態頁文件
 3 $expr = 3600*24*10;//靜態文件有效期,十天
 4 if(file_exists($goods_statis_file)){
 5   $file_ctime =filectime($goods_statis_file);//文件建立時間
 6      if($file_ctime+$expr-->time()){//若是沒過時
 7       echo file_get_contents($goods_statis_file);//輸出靜態文件內容
 8          exit;
 9      }else{//若是已過時
10          unlink($goods_statis_file);//刪除過時的靜態頁文件
11          ob_start();
12   
13             //從數據庫讀取數據,並賦值給相關變量
14   
15             //include ("xxx.html");//加載對應的商品詳情頁模板
16   
17             $content = ob_get_contents();//把詳情頁內容賦值給$content變量
18             file_put_contents($goods_statis_file,$content);//寫入內容到對應靜態文件中
19             ob_end_flush();//輸出商品詳情頁信息
20      }
21 }else{
22  ob_start();
23   
24  //從數據庫讀取數據,並賦值給相關變量
25   
26  //include ("xxx.html");//加載對應的商品詳情頁模板
27   
28  $content = ob_get_contents();//把詳情頁內容賦值給$content變量
29  file_put_contents($goods_statis_file,$content);//寫入內容到對應靜態文件中
30  ob_end_flush();//輸出商品詳情頁信息
31   
32 }

 

 

靜態化以前:安全

 

<?php
for($i=0;$i<1000;$i++){
 echo "bull<br>";
}
?>

  靜態化:服務器

<?php
ob_start();
for($i=0;$i<1000;$i++){
 echo "bull<br>";
}
$str = ob_get_contents();
ob_end_clean();
$fp = fopen("test.html","w");
fwrite($fp,$str);
fclose($fp);
echo "<div>success write</div>";
?>

  

該段代碼就會預先造成一個test.html,說白了其實就是用空間換取時間,像新聞類網站,發佈的內容基本上寫完是不會變了,比較適合靜態化成html。nosql

用戶訪問的時候就direct到這個html頁面上就能夠了。memcached

另附相關函數簡介


1)、Flush:刷新緩衝區的內容,輸出。
函數格式:flush()
說明:這個函數常用,效率很高。

2)、ob_start :打開輸出緩衝區
函數格式:void ob_start(void)
說明:當緩衝區激活時,全部來自PHP程序的非文件頭信息均不會發送,而是保存在內部緩衝區。爲了輸出緩衝區的內容,可使用ob_end_flush()或flush()輸出緩衝區的內容。

3) 、ob_get_contents :返回內部緩衝區的內容。
使用方法:string ob_get_contents(void)
說明:這個函數會返回當前緩衝區中的內容,若是輸出緩衝區沒有激活,則返回 FALSE 。

4)、ob_get_length:返回內部緩衝區的長度。
使用方法:int ob_get_length(void)
說明:這個函數會返回當前緩衝區中的長度;和ob_get_contents同樣,若是輸出緩衝區沒有激活。則返回 FALSE。

5)、ob_end_flush :發送內部緩衝區的內容到瀏覽器,而且關閉輸出緩衝區。
使用方法:void ob_end_flush(void)
說明:這個函數發送輸出緩衝區的內容(若是有的話)。

6)、ob_end_clean:刪除內部緩衝區的內容,而且關閉內部緩衝區
使用方法:void ob_end_clean(void)
說明:這個函數不會輸出內部緩衝區的內容而是把它刪除!

7)、ob_implicit_flush:打開或關閉絕對刷新
使用方法:void ob_implicit_flush ([int flag])
說明:使用過Perl的人都知道$|=x的意義,這個字符串能夠打開/關閉緩衝區,而ob_implicit_flush函數也和那個同樣,默認爲關閉緩衝區,打開絕對輸出後,每一個腳本輸出都直接發送到瀏覽器,再也不須要調用 flush()。

2.使用nosql從內存中讀取內容(其實這個已經不算靜態化了而是緩存);

以memcache爲例:

 

 1 $gid = $_GET['gid']+0;//商品id
 2 $goods_statis_content = "goods_content_".$gid;//對應鍵
 3 $expr = 3600*24*10;//有效期,十天
 4   
 5 $mem = new Memcache; 
 6 $mem--->connect('memcache_host', 11211);
 7   
 8 $mem_goods_content = $mem->get($goods_statis_content);
 9   
10   
11   
12 if($mem_goods_content){
13   echo $mem_goods_content;
14 }else{
15  ob_start();
16   
17  //從數據庫讀取數據,並賦值給相關變量
18   
19  //include ("xxx.html");//加載對應的商品詳情頁模板
20   
21  $content = ob_get_contents();//把詳情頁內容賦值給$content變量
22  $mem->add($goods_statis_content,$content, false, $expr);
23  ob_end_flush();//輸出商品詳情頁信息
24   
25 }

 

memcached是鍵值一一對應,key默認最大不能超過128個字節,value默認大小是1M,所以1M大小知足大多數網頁大小的存儲。

 

其餘還有模板替換法,opcache等方法。

轉自http://www.jb51.net/article/59619.htm

相關文章
相關標籤/搜索