天天看點

網站提速-頁面靜态化(2)第一篇、頁面靜态化

<b>頁面靜态化概念</b><b></b>

<b></b>

我們大多數情況下是直接通路php檔案,php腳本在伺服器端執行并

傳回資訊,對于一些大型的網站,通路量很大,頻繁的動态操作和操作

資料庫會加重伺服器的負擔.在實際開發中,通常使用緩存技術()或者頁面靜态化來解決

<b>頁面靜态化分為</b><b>:</b>

① 真靜态 :把 php-&gt;html 通路時就不操作資料庫

② 僞靜态:隻是把網址靜态 (通路資料庫)

<b>Apache/bin/ab</b><b>壓力測試工具</b><b></b>

介紹壓力測試工具是為了顯示動态頁面和靜态頁面在大通路量的情況下的相應時間,如apache/bin/ab.exe 程式可以來做效率測試

基本使用:

ab [options] [http[s]://]hostname[:port]/path

options是選項:

-n  執行通路次數

-c  使用者并發數量

Apache2.2之後的版本有ab壓力測試工具可以直接使用

表示10個使用者發送1000次請求

我們可以在htdocs中建立内容相同的index.html和index.php頁面

測試:/usr/local/apache2/bin/ab –c 10 –n 1000 http://192.168.211.128/index.html

<a href="http://img1.51cto.com/attachment/201208/103658596.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002412734.gif"></a>

/usr/local/apache2/bin/ab –c 10 –n 1000 http://192.168.211.128/index.php

<a href="http://img1.51cto.com/attachment/201208/103711333.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002456166.gif"></a>

可以看到html的速度要明顯快于php頁面。

<b>使用</b><b>php</b><b>緩存機制完成頁面靜态化</b><b></b>

我們可以使用php自帶的緩存機制來完成頁面靜态化,但在這裡我要

說明一點,僅靠php自身的緩存機制并不能完美的解決頁面靜态化,

往往需要和其它靜态化技術(通常是僞靜态技術)結合使用,

例子:當通路一個頁面時,先判斷是否存在緩存,如果存在,則直接輸出緩存檔案中的内容。否則,則先查詢資料庫,獲得資料,然後生成緩存檔案。

<b>搭建</b><b>wamp</b><b>環境</b><b></b>

我們使用appserver搭建:

搭建過程安裝apache,安裝mysql,安裝php,它會內建phpMyAdmin等軟體然後可以直接使用了,它的網站目錄在appserver的www目錄。

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002508932.gif"></a>

為了是環境支援php緩存,要修改c:\windows\php.ini

Display_errors=on

Output_buffering=on  //可以會影響執行正常網站程式效率

例如我們做一個新聞子產品的頁面,如果頁面對實時性要求不高,并且比較穩定,當第一個使用者通路新聞頁面後,我們可以使用ob緩存機制,把内容緩存到html頁面,下次使用直接調用即可。

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002522847.gif"></a>

我們建立一個新聞頁面後還要建立測試資料庫。

Create table news(id int primary key auto_increment,title varchar(128)) not null ,content varchar(256) not null,filename varchar(32));

Insert into news(title,content)  values("hello","早上好");

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002533117.gif"></a>

<b>News_list.php   //</b><b>新聞首頁</b><b></b>

&lt;?php

 //查詢新聞清單

// mysql_query('set name utf8');

 $conn=mysql_connect("localhost","root","5991461");

   if(!$conn){

     die("連接配接失敗");

        }

        mysql_select_db("test",$conn);

        $sql="select * from news";

        $res=mysql_query($sql);

 header("content-type:text/html;charset=utf-8");

 echo "&lt;h1&gt;news list:";

 echo "&lt;a href='#'&gt;add news&lt;/a&gt;&lt;hr/&gt;";

 echo "&lt;table&gt;";

 echo "&lt;tr&gt;&lt;td&gt;id&lt;/td&gt;&lt;td&gt;title&lt;/td&gt;&lt;td&gt;content&lt;/td&gt;&lt;/tr&gt;";

 while ($row=mysql_fetch_assoc($res)){

 echo "&lt;tr&gt;&lt;td&gt;{$row['id']}&lt;/td&gt;&lt;td&gt;{$row['title']}&lt;/td&gt;&lt;td&gt;&lt;a href='show_news.php?id={$row['id']}'&gt;detail&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;";

 }

 echo "&lt;/table&gt;";

 //關閉連接配接

 mysql_free_result($res);

 mysql_close($conn);

 ?&gt;

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002546602.gif"></a>

<b>Show_News.php  //</b><b>顯示新聞頁</b><b></b>

//接收id

 //$id=@$_GET['id'];

        $sql="select * from news where id=$id";

        //開啟緩存

        ob_start();

        if ($row=mysql_fetch_assoc($res)){

header("content-type:text/html;charset=utf-8");

echo "&lt;table border='1px' bordercolor='green' cellspacing='0'

width=400px heigh=300px &gt;";

echo "&lt;tr&gt;&lt;td&gt;detail&lt;/td&gt;&lt;/tr&gt;";

echo "&lt;tr&gt;&lt;td&gt;{$row['title']}&lt;/td&gt;&lt;/tr&gt;";

echo "&lt;tr&gt;&lt;td&gt;{$row['content']}&lt;/td&gt;&lt;/tr&gt;";

echo "&lt;/table&gt;";

}

else{

 echo "not found!";

//建構一個檔案名

$html_content=ob_get_contents();

//把ob-》$html_filename(必要時要考慮路徑)

$html_filename="news_id".$id.".html";

file_put_contents($html_filename,$html_content);

?&gt;

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002610425.gif"></a>

因為開啟了ob緩存,我們會看到生成了news_id2.htm的靜态頁,我們使用靜态頁來通路會發現内容和動态頁一樣的。

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002822663.gif"></a>

if(file_exists($html_filename)){

 //存在就直接通路

 echo "static pager";

 echo file_get_contents($html_filename);

 exit;

 }   //加入開頭,如果靜态頁面存在,就直接跳轉到靜态頁,否則才調用資料庫。

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002915181.gif"></a>

但是ob緩存方式有個缺點,如果資料庫更新了頁面不會自動更新:解決辦法,我們可以設定一個時間來判斷靜态頁面是否過期,如過期則重新建立。

 $html_filename="news_id".$id.".html";

 if(file_exists($html_filename)&amp;&amp;filemtime($html_filename)+30&gt;time()){

例如我們做一個資料庫更新:

Update news set content=“good evening” where id=1;

然後比較使用了時間戳前後頁面的變化。

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002930646.gif"></a>

使用前:

<a target="_blank" href="http://blog.51cto.com/attachment/201210/002942311.gif"></a>

加入代碼後檔案就會自動更新了

<b>Ob</b><b>緩存的改進:</b><b></b>

1/實時性不夠好,30秒延時。

2/頁面仍然帶php的痕迹,show_news.php?id={$row['id']}。

當我們添加新的内容的時候,就同步生成一個靜态檔案。

<b>Add_news.html  //</b><b>添加新聞的頁面</b><b></b>

&lt;html&gt;

&lt;head&gt;

&lt;title&gt;新聞标題&lt;/title&gt;

&lt;/head&gt;

&lt;!--我們送出一個添加頁面時,便會調用模闆生成一個靜态頁面--&gt;

&lt;form action="newsAction.php" method="post"&gt;

&lt;table&gt;

&lt;tr&gt;&lt;td&gt;新聞标題&lt;/td&gt;&lt;td&gt;&lt;input type="test" name="title"/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;新聞内容&lt;/td&gt;&lt;td&gt;&lt;textarea cols="50" rows="10" name="content"&gt;

&lt;/textarea&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;input type="submit" value="添加"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input

type="reset" value="重新填寫"/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;

&lt;/form&gt;

&lt;/html&gt;

<a target="_blank" href="http://blog.51cto.com/attachment/201210/003010371.gif"></a>

 然後給add news 賦予超連結即可完成跳轉:

echo "&lt;a href='add_news.html'&gt;add news&lt;/a&gt;&lt;hr/&gt;";

<a target="_blank" href="http://blog.51cto.com/attachment/201210/003023237.gif"></a>

<b>newsAction.php    //</b><b>建立一個自動相應頁</b><b></b>

//頁面完成添加,放入資料庫的同時建立html頁面

$oper=$_POST['oper'];

if($oper=="add"){

//接收title,content

  $title=$_POST['title'];

  $content=$_POST['content'];

        $sql="insert into news(title,content) values('$title','$content')";

       if(mysql_query($sql,$conn)){

       //擷取剛剛插入的資料id号

       $id=mysql_insert_id();

       //建立檔案名

       $html_filename="news_id".$id.".html";

       echo "filename=".$html_filename;

       }

        //關閉連接配接

然後我們要做的是生成靜态頁面。定義一個函數replace,然後傳遞,斷開連接配接即可。

//替換,$title代替%title%

header("content-type:text/html;charset=gbk");

       function replace($row,$title,$content){

       $row=str_replace("%title%",$title,$row);

       $row=str_replace("%content%",$content,$row);

       return $row;

$oper=$_REQUEST['oper'];

       //echo "filename=".$html_filename;

       $fp_tmp=fopen("template.tpl","r");

       $fp_html_file=fopen($html_filename,"w+");

       //讀取template檔案轉化為html檔案

       while(!feof($fp_tmp)) { //如果沒到結尾

       //讀取一行

       $row=fgets($fp_tmp);

       //替換

       $new_row=replace($row,$title,$content);

       "fwrite($fp_hmtl_file,$new_row)";

       //關閉檔案

       fclose($fp_tmp);

       fclose($fp_html_file);

       echo "insert success&lt;a href='news_list.php'&gt;return&lt;/a&gt;";

這時我們修改,news_list.php,添加靜态頁面連接配接。

 echo "&lt;tr&gt;&lt;td&gt;{$row['id']}&lt;/td&gt;&lt;td&gt;{$row['title']}&lt;/td&gt;&lt;td&gt;&lt;a href='news_id{$row['id']}.html'&gt;detail&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;";

<b>頁面靜态化</b><b>(</b><b>真靜态</b><b>)</b><b>的優點和缺點</b><b> </b>

html靜态頁(真靜态)的好處有三點;一是減少伺服器對資料響應的負荷,二是加載不用調動資料庫,響應速度快。三是便于優化引擎。

缺點也有幾點:一是空間占用比較大。二是生成的檔案多了,伺服器對html檔案的響應負擔也較重。

本文轉自zsaisai 51CTO部落格,原文連結:http://blog.51cto.com/3402313/1032798