頁面靜態化


頁面靜態化

 

u 大型網站的核心技術有哪些(帶寬 數據庫  )

連接池

1. 頁面靜態化 核心 把動態的頁面 轉成 靜態頁面 從而減少對數據庫操作的次數 )

2. 緩存技術(內存角度存儲->memcached)

3. 服務器集群(a. 硬件 b. 軟件架構)

簡單介紹 -> 示意圖:

 

4. 數據庫優化(a. 表結構(符號3NF) b. 添加適當索引 (1.1主鍵索引 1.2 普通索引 1.3 唯一索引 1.4 全文索引 sphinx ) c. 讀寫分離 d. 分表(垂直分割 水平分割 ) )

 

 

 

u 頁面靜態化技術

 

u 幾個重要的概念

 

1. 靜態網址

舉例: http://localhost/test.html  

當我們的頁面是 靜態頁面時, 則,我們放的url 就是一個靜態網址

好處是 a. 利用seo (search engine optimization ) 搜索引擎優化. b. 防止sql注入攻擊

c. 不操作數據庫,所以效率高

 

2. 動態網址

舉例 :  http://localhost/test.php?age=80

特點是一般說可以接受用戶的數據,

http://localhost/news.php?lang=cn&class=1&id=2

動態網址,不利用SEO ,因為搜索引擎認為,動態網頁的內容一般說都會和數據庫相關,所以 搜索引擎就會放棄抓取.

 

3. 偽靜態網址

我們公司開發是,為了SEO,同時為了防止 注入攻擊,往往會把 動態網站 改寫成 靜態網址 這樣的網址,我們稱為偽靜態

http://localhost/news.php?lang=cn&class=1&id=2

 

希望

http://localhost/news-cn-sport-id2.html (這個網址就是偽靜態),但是請大家注意,偽靜態網站不是真正的靜態頁面,所以,只是形式上的,訪問它,仍然會訪問數據庫

 

=>偽靜態技術

 

u 頁面靜態化的分類

1. 從形式上分為 真靜態和偽靜態

2. 從范圍看: 整體靜態化,和局部靜態

 

 

介紹一款工具 apache自帶的 ab.exe 程序,該程序可以用於測試 你的頁面的效率怎樣同時可以測試你的apache的負載能力有多大! , 該程序在控制台下使用

 

使用的語法:

ab.exe –n 請求的次數  -c 並發次數 訪問的頁面的url地址

 

說明  並發次數 在同一個時間點,發出的請求次數 

 

舉例說明

寫一個  test1.php 頁面

 

ab.exe –n 10000 –c 100 http://localhost/test1.php

 

注意如何看統計信息:

 

 

后面我們給了一個大致的結論:

① 網站能支撐的在線人數大致是支撐 並發人數的 10左右

② htmlPHP訪問的效率表

 

 

u 怎樣的Html文件,會符號 SEO 的喜好

1. url  不要超過 255

2. 靜態頁面不要帶參數 ,造成重復抓取

3. meta 數據盡量完善

<meta name=”keywords”  content=”關鍵字 ”/>

<meta name=”description” content=”頁面的簡單介紹”/>

4. <img src=”小明.png” alt=”小明”/> 

5. 頁面不在建議使用 框架 frame/frameset/iframe 不建議在前端頁面使用 

 

 

 

u 頁面靜態化有兩種 1. 真靜態 2. 偽靜態

 

真靜態有兩個方法

1. 使用PHP 的 ob緩存機制來實現 頁面靜態化

 

 

 

2. 使用模板技術來實現頁面靜態化

 

u OB緩存是什么?怎么用?

1. 快速入門

 

注意PHP5.3 這個版本,ob默認是打開的.

PHP5.2 這會報告waring

我們可以通過 php.ini 中可以配置是否啟用 ob

 

 

初步的認識:

 

☞ 我們可以認為,在apache的服務器端,有兩個緩存 ob緩存(這個程序員可以控制)

,程序緩存是必須有的.

當有一段代碼 <?php echo “abc” ; ?> 如果有 echo ,當你啟用 ob緩存,那么這些echo 優化放在ob緩存中如果沒有ob緩存,則直接放入了程序緩存.

 

如果你只有程序緩存,需要大家清楚,header 語句前,不能有 echo 語句,否則有提示

headers already sent by

截圖:

 

 

ob的相關函數.

 

 

說明的代碼:

ob3.php

<?php

 

 

//這里我們可以再找個頁面把ob緩存打開

//開啟ob緩存

ob_start();

echo "hello,wrold!";

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

 

echo "你好!";

 

//ob內容緩存清空,但是ob緩存還在

//ob_clean();

//ob內容緩存清空,同時關閉ob緩存

//ob_end_clean();

//ob緩存的內容,刷新到程序緩存,同時關閉ob緩存

//ob_end_flush();

//ob緩存的內容,刷新到程序緩存,不關閉ob緩存

ob_flush();

 

echo "笑傲江湖";

 

//獲取ob緩存內容

$con=ob_get_contents();

 

//需要把日志,寫入文件. echo print_r var_dump ,寫文件 ,下斷點.

file_put_contents("d://hsp.log",$con);

 

 

現在我們再說最后一個函數 flush()

該函數是把 程序緩存的內容,強制刷新到 瀏覽器

ob4.php

 

 

 

 

這里有一個知識點:

 

當我們請求一個PHP頁面時,該頁面會發出幾次請求,和各部分的代碼在哪里執行示意圖:

 

u 使用ob緩存實現頁面靜態化

 

現在開始以一個新聞管理系統,來學習我們的頁面靜態化.

 

1. 先創建數據庫和表

create table news(

id int unsigned primary key auto_increment, /*新聞編號*/

title varchar(128) not null, /*新聞的標題*/

content varchar(256) not null, /*新聞的內容*/

filename varchar(32)) engine=MyISAM /*是該新聞對於的靜態頁面的名字*/

 

u MyISAM 和 InnoDB

1. MyISAM 不支持事務 , InnoDB支持事務

2. MyISAM速度相對快,InnoDB 速度相對慢.

3. MyISAM 不支持外鍵, InnoDB支持外鍵

 

外鍵的概念: PHP中用的不多,大家了解即可.

 

2. 添加兩條初始化的數據

insert into news (title,content) values('hello1','北京你好');

insert into news (title,content) values('hello2','四川你好');

 

 

 

思考:

1. 這時,不同的用戶沒查看一次新聞,就會到數據庫去查詢一次這樣做是不對的,因為新聞,文章他們的變換不多,所以,我可以第一次查詢數據,並生成靜態頁面,news-idx.html, 然后我們第二次和以后,都直接返回該靜態頁面即可,

2. 現在開始改進  -ob緩存

3. 思考-> 問題?

3.1 網址不是靜態網址偽靜態網站

3.2 如果我們的內容修改,我們將看不到修改的頁面

 

先搞定這個問題.,

方法1: 通過比較文件的時間來 定時更新,即可,對於對應實時性要求不高的網站,是完全沒有問題

if(file_exists($html_name) && filemtime($html_name)+30> time() ){

echo "使用緩存";

echo file_get_contents($html_name);

exit;

}

方法2; 現在我們可以這樣考慮,當我們添加新聞,修改新聞時,就實時的更新數據庫同時去更新靜態頁面->使用模板技術 

 

實現思路: smarty 模板替換-> 正則表達式

 

最總代碼:

 

newsList.php

<?php

 

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

echo "<h1>新聞列表</h1>";

echo "<a href='addNews.html'>添加新聞</a><hr/>";

echo "<table>";

echo "<tr><td>id</td><td>標題</td><td>查看詳情</td></tr>";

 

 

//mysql.class.php 工具類來完成數據的獲取

$con=mysql_connect("localhost","root","root");

if(!$con){

die("連接失敗");

}

mysql_select_db("newsdb",$con);

$sql="select * from news";

$res=mysql_query($sql,$con);

 

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

 

echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href=' news-id{$row['id']}.html'>查看詳情</a></td></tr>";

}

 

  echo "</table>";

 

  //關閉資源

  mysql_free_result($res);

 mysql_close($con);

 

 

addNews.html

 

<head>

<title>新聞標題</title>

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

</head>

 

<!--我們在添加新聞時,就同時生成一個對應的新聞頁面(比如你設計好的一個新聞內容顯示模板)-->

 

<form action="newsAction.php" method="post">

<table>

<tr><td>新聞標題</td><td><input type="text" 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>

<!--隱藏區,用於告訴 newsAction.php 我請求什么-->

<input type='hidden' name='oper' value='add'/>

</table>

</form>

</html>

 

newsAction.php

 

<?php

 

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

 

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

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

return $row;

}

 

//獲取

$oper=$_POST['oper'];

 

if($oper=="add"){

 

//思路

$title=$_POST['title'];

$content=$_POST['content'];

 

//入庫. Mysql.class.php

 

$con=mysql_connect("localhost","root","root");

if(!$con){

die("連接失敗");

}

mysql_select_db("newsdb",$con);

 

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

if(mysql_query($sql)){

 

//獲取新聞id

$id=mysql_insert_id();

$html_filename="news-id".$id.".html";

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

//讀取模板文件

$tpl_file=fopen("news.tpl","r");

//一行一行的讀

while(!feof($tpl_file)){

 

//讀入一行

$row=fgets($tpl_file);

//我就一行一行的替換,我寫一個函數來專門替換占位符.

$row=myreplace($row,$title,$content);

//$row寫入到新文件

fwrite($fp_html_file,$row);

 

 

}

 

//關閉文件.

fclose($fp_html_file);

fclose($tpl_file);

 

echo "添加成功,  <a href='newsList.php'>點擊查看新聞</a>";

}else{

echo "添加失敗!";

}

 

 

}else if($oper=="update"){

 

}else if($oper=="delete"){

 

}

 

作用請大家完成,完成修改頁面:

 

ob1.php
<html>
<input type="text" name="name" />
<style src="ab.css" type="text/css"/>
<script type="text/javascrpt">
alert("hello");
</script>
<?php 
    $res=0;
   for ($i=0;$i<10;$i++){ 
    $res+=$i;
   }
  echo $res;
?>

問題:

1. 請求ob1.php 頁面后,瀏覽器共發出多少次http請求

a. 發出兩次請求,一次是請求php頁面本身

b. 如果發現有資源則繼續請求 ab.css

 

 

2. 各部分的代碼在哪里運行

說明: php代碼要在服務器運行

html代碼返回 js代碼返回,在瀏覽器運

3. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM