頁面靜態化
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左右
② html和PHP訪問的效率表
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.