网站提速-页面静态化(2)
?
第一篇、頁面靜態化
頁面靜態化概念
我們大多數情況下是直接訪問php文件,php腳本在服務器端執行并
返回信息,對于一些大型的網站,訪問量很大,頻繁的動態操作和操作
數據庫會加重服務器的負擔.在實際開發中,通常使用緩存技術()或者頁面靜態化來解決
頁面靜態化分為:
① 真靜態 :把 php->html 訪問時就不操作數據庫
② 偽靜態:只是把網址靜態 (訪問數據庫)
Apache/bin/ab壓力測試工具
介紹壓力測試工具是為了顯示動態頁面和靜態頁面在大訪問量的情況下的相應時間,如apache/bin/ab.exe 程序可以來做效率測試
基本使用:
ab [options] [http[s]://]hostname[:port]/path
options是選項:
-n? 執行訪問次數
-c? 用戶并發數量
Apache2.2之后的版本有ab壓力測試工具可以直接使用
/usr/local/apache2/bin/ab –c 10 –n 1000 http://ip/index.php
表示10個用戶發送1000次請求
我們可以在htdocs中建立內容相同的index.html和index.php頁面
測試:/usr/local/apache2/bin/ab –c 10 –n 1000 http://192.168.211.128/index.html
?
/usr/local/apache2/bin/ab –c 10 –n 1000 http://192.168.211.128/index.php
可以看到html的速度要明顯快于php頁面。
使用php緩存機制完成頁面靜態化
我們可以使用php自帶的緩存機制來完成頁面靜態化,但在這里我要
說明一點,僅靠php自身的緩存機制并不能完美的解決頁面靜態化,
往往需要和其它靜態化技術(通常是偽靜態技術)結合使用,
例子:當訪問一個頁面時,先判斷是否存在緩存,如果存在,則直接輸出緩存文件中的內容。否則,則先查詢數據庫,獲得數據,然后生成緩存文件。
搭建wamp環境
我們使用appserver搭建:
搭建過程安裝apache,安裝mysql,安裝php,它會集成phpMyAdmin等軟件然后可以直接使用了,它的網站目錄在appserver的www目錄。
為了是環境支持php緩存,要修改c:\windows\php.ini
Display_errors=on
Output_buffering=on? //可以會影響執行正常網站程序效率
使用php緩存機制完成頁面靜態化
例如我們做一個新聞模塊的頁面,如果頁面對實時性要求不高,并且比較穩定,當第一個用戶訪問新聞頁面后,我們可以使用ob緩存機制,把內容緩存到html頁面,下次使用直接調用即可。
我們建立一個新聞頁面后還要建立測試數據庫。
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","早上好");
News_list.php?? //新聞首頁
<?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 "<h1>news list:";
?echo "<a href='#'>add news</a><hr/>";
?echo "<table>";
?echo "<tr><td>id</td><td>title</td><td>content</td></tr>";
?while ($row=mysql_fetch_assoc($res)){
?echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href='show_news.php?id={$row['id']}'>detail</a></td></tr>";
?}
?echo "</table>";
?//關閉連接
?mysql_free_result($res);
?mysql_close($conn);
??>
Show_News.php? //顯示新聞頁
<?php
//接收id
?//$id=@$_GET['id'];
?$conn=mysql_connect("localhost","root","5991461");
?? if(!$conn){
???? die("連接失敗");
?????? ?}
?????? ?mysql_select_db("test",$conn);
?????? ?$sql="select * from news where id=$id";
?????? ?$res=mysql_query($sql);
?????? ?
?????? ?//開啟緩存
?????? ?ob_start();
?????? ?if ($row=mysql_fetch_assoc($res)){
?
header("content-type:text/html;charset=utf-8");
echo "<table border='1px' bordercolor='green' cellspacing='0'
width=400px heigh=300px >";
echo "<tr><td>detail</td></tr>";
echo "<tr><td>{$row['title']}</td></tr>";
echo "<tr><td>{$row['content']}</td></tr>";
echo "</table>";
}
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);
?
?//關閉連接
?mysql_free_result($res);
?mysql_close($conn);
?
?>
因為開啟了ob緩存,我們會看到生成了news_id2.htm的靜態頁,我們使用靜態頁來訪問會發現內容和動態頁一樣的。
?
if(file_exists($html_filename)){
?//存在就直接訪問
?echo "static pager";
?echo file_get_contents($html_filename);
?exit;
?}?? //加入開頭,如果靜態頁面存在,就直接跳轉到靜態頁,否則才調用數據庫。
但是ob緩存方式有個缺點,如果數據庫更新了頁面不會自動更新:解決辦法,我們可以設置一個時間來判斷靜態頁面是否過期,如過期則重新創建。
<?php
//接收id
?//$id=@$_GET['id'];
?$html_filename="news_id".$id.".html";
?if(file_exists($html_filename)&&filemtime($html_filename)+30>time()){
?//存在就直接訪問
?echo "static pager";
?echo file_get_contents($html_filename);
?exit;
??>
例如我們做一個數據庫更新:
Update news set content=“good evening” where id=1;
然后比較使用了時間戳前后頁面的變化。
使用前:
加入代碼后文件就會自動更新了
Ob緩存的改進:
1/實時性不夠好,30秒延時。
2/頁面仍然帶php的痕跡,show_news.php?id={$row['id']}。
當我們添加新的內容的時候,就同步生成一個靜態文件。
Add_news.html? //添加新聞的頁面
<html>
<head>
<title>新聞標題</title>
</head>
<!--我們提交一個添加頁面時,便會調用模板生成一個靜態頁面-->
<form action="newsAction.php" method="post">
<table>
<tr><td>新聞標題</td><td><input type="test" name="title"/></td></tr>
<tr><td>新聞內容</td><td><textarea cols="50" rows="10" name="content">
</textarea></td></tr>
<tr><td><input type="submit" value="添加"/></td><td><input
type="reset" value="重新填寫"/></td></tr>
</table>
</form>
</html>
?然后給add news 賦予超鏈接即可完成跳轉:
echo "<a href='add_news.html'>add news</a><hr/>";
newsAction.php??? //建立一個自動相應頁
<?php
//頁面完成添加,放入數據庫的同時建立html頁面
$oper=$_POST['oper'];
?
if($oper=="add"){
?
//接收title,content
? $title=$_POST['title'];
? $content=$_POST['content'];
?
?$conn=mysql_connect("localhost","root","5991461");
?? if(!$conn){
???? die("連接失敗");
?????? ?}
?????? ?mysql_select_db("test",$conn);
?????? ?$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;
?????? }
??????
?????? ?//關閉連接
?mysql_close($conn);
?????? }
?>
然后我們要做的是生成靜態頁面。定義一個函數replace,然后傳遞,斷開連接即可。
<?php
//頁面完成添加,放入數據庫的同時建立html頁面
//替換,$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'];
?
if($oper=="add"){
?
//接收title,content
? $title=$_POST['title'];
? $content=$_POST['content'];
?
?$conn=mysql_connect("localhost","root","5991461");
?? if(!$conn){
???? die("連接失敗");
?????? ?}
?????? ?mysql_select_db("test",$conn);
?????? ?$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;
?????? $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<a href='news_list.php'>return</a>";
?????? }
??????
?????? ?//關閉連接
?mysql_close($conn);
?????? }
?>
這時我們修改,news_list.php,添加靜態頁面連接。
?echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href='news_id{$row['id']}.html'>detail</a></td></tr>";
?
<?php
//接收id
?//$id=@$_GET['id'];
?$html_filename="news_id".$id.".html";
?echo file_get_contents($html_filename);
?>
頁面靜態化(真靜態)的優點和缺點?
html靜態頁(真靜態)的好處有三點;一是減少服務器對數據響應的負荷,二是加載不用調動數據庫,響應速度快。三是便于優化引擎。
缺點也有幾點:一是空間占用比較大。二是生成的文件多了,服務器對html文件的響應負擔也較重。
轉載于:https://blog.51cto.com/3402313/1032798
總結
以上是生活随笔為你收集整理的网站提速-页面静态化(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 活动安排问题--贪心算法
- 下一篇: awk学习笔记(10) - 数组