如何為(wèi)大型網站提速?緩存技(jì )術memcache、 靜态化、 mysql優化,分(fēn)别從内存,文(wén)件,數據庫三個方面來進行優化達到給網站提速的目的.
1. 訪問php的速度比html慢
在apache / bin /ab.exe 可(kě)以做壓力測試,該工(gōng)具(jù)可(kě)以模拟多(duō)人,并發訪問某個頁(yè)面.
基本的用(yòng)法
//–n 10000 請求多(duō)少次
//–c 10
ab.exe –n 10000 –c 10
-n 表示 請求多(duō)少次
-c 表示 多(duō)少人
2. 靜态化利于seo
3. 防止sql注入
① 真靜态
方法1: 使用(yòng)php自身的緩存機制
output_buffering 緩存
程序緩存
如果要測試php自己的緩存機制, 需要做配置.
php.ini 文(wén)件
display_errors=On
output_buffering=Off
error_reproting= 設置錯誤級别
看一段代碼
<?php
echo “yyy”;
header(“content-type:text/htm;charset=utf-8”);
echo “hello”;
?>
開啓緩存: 1. Ob_start();
2. Php.ini
Ob_get_contents() 獲取 output_buffering 的内容
Ob_clean();清空 output_buffering 的内容
Ob_end_clean() 關閉緩存 并删除ob 内容
Ob_end_flush() 輸出緩存ob内容并關閉緩存
Ob_flush() 輸出緩存ob内容并清空
Flush() 刷新(xīn)程序緩存的内容
Str_repeat("",100); //顯示100個空白
這裏我們看一個綜合案例,需求如下:
傳統解決方法:
頁(yè)面靜态化思路:
因為(wèi)新(xīn)聞這種信息不是對實時性要求高,并且比較穩定,所以我們可(kě)以這樣做,當第一個用(yòng)戶訪問某條新(xīn)聞後,我們使用(yòng)ob的緩存機制,把内容緩存到html頁(yè)面,當下一次訪問時,直接訪問html即可(kě).
問題?
1. 如果我們的新(xīn)聞更新(xīn)了,這樣我們的靜态頁(yè)面不變->解決
解決方法1,我們可(kě)以判斷靜态頁(yè)面是否過期(30s) ,如果過期,則重新(xīn)創建
代碼:-->
if(file_exists($html_filename)&& filemtime($html_filename)+30>time()){
//直接訪問html頁(yè)面(把html頁(yè)面的内容 echo 浏覽器)
echo file_get_contents($html_filename);
exit;
}
難道這樣就完美了嗎?
1. news_list.php頁(yè)面中(zhōng)點擊 查看時候,仍然是一個php頁(yè)面-> html網址
2. 實時性不夠好,30s的延時..
解決思想:
當我們添加新(xīn)聞或者更新(xīn)新(xīn)聞的時候,就同步的更新(xīn)html靜态頁(yè)面,通常的做法,設計模闆文(wén)件(網頁(yè)設計師/美工(gōng)),通過模闆創建靜态頁(yè)面.
整理(lǐ)思路
提出為(wèi)什麽需要靜态化.
靜态化的方式( 使用(yòng)ob 緩存來實現靜态化 問題1 實時性不好,有(yǒu)延時, 2, 請求某個查詢頁(yè)面時使用(yòng) php動态網站)
真靜态 (在 添加和修改的時候,可(kě)以實時的處理(lǐ)靜态頁(yè)面 問題 如果數據時海量的,造成真靜态的html 文(wén)件過多(duō),占用(yòng)磁盤很(hěn)大.)僞靜态技(jì )術
② 僞靜态
我們可(kě)以有(yǒu)兩種方法來處理(lǐ)
1. 在php文(wén)件中(zhōng),直接使用(yòng)正則表達式技(jì )術處理(lǐ)
代碼:
<?php
//echo "hello ok";
//echo "<pre>";
//print_r($_SERVER);
//echo "</pre>";
$parameters=$_SERVER['PATH_INFO'];
if(preg_match('/^\/(\d+),(\d+),(\d+)\.html/si',$parameters,$arr)){
echo $arr[1]."<br/>";
echo $arr[2]."<br/>";
echo $arr[3]."<br/>";
}else{
echo "輸入的地址有(yǒu)誤!";
}
?>
課後練習:
請使用(yòng)正則表達式完成
在news.php頁(yè)面中(zhōng)可(kě)以獲取到
news sport 5
提出問題?
相當向 http://localhost/news.php?class=sport&id=56
2. 配置apache的rewrite來處理(lǐ)
快速入門案例
請求
原理(lǐ)圖
如何使用(yòng)rewrite步驟:
1. 配置apache,啓用(yòng)rewrite機制
在httpd.conf中(zhōng)啓用(yòng)rewrite
LoadModule rewrite_module modules/mod_rewrite.so
2. 配置虛拟主機
到 c盤 hosts文(wén)件添加你的 ip 和 域名(míng)對應
127.0.0.1
在 http.conf 文(wén)件中(zhōng)啓用(yòng)虛拟主機
# Virtual hosts 啓用(yòng)虛拟主機
Include conf/extra/httpd-vhosts.conf
3. 配置 httpd_vhosts.conf文(wén)件
在 <Direcotry >段的配置,默認值,是在httpd.conf 的中(zhōng)配置,看根目錄.
<VirtualHost *:80>
#ServerAdmin webmaster@dummy-host2.somenet.com
#文(wén)檔的根目錄
DocumentRoot "C:/myenv/apache/htdocs/static3"
#域名(míng)
ServerName www.hsp.com
ErrorLog "logs/dummy-host2.somenet.com-error.log"
#CustomLog "logs/dummy-host2.somenet.com-access.log" common
#配置rewrite相關選項,
<Directory "C:/myenv/apache/htdocs/static3">
#拒絕所有(yǒu)的訪問
#Deny from all
Allow from all
#是否顯示列表(在發布項目後一般是不啓用(yòng),對于這個配置,針對 DocumentRoot在htdos外的目錄生效)
#Options +indexes
#是否啓用(yòng)rewrite
#Allowoverride all
</Directory>
</VirtualHost>
4.在目錄下添加了一個 .htaccess 文(wén)件,這個文(wén)件時配置rewrite機制和規則
<IfModule rewrite_module>
#寫你的rewrite規則
RewriteEngine On
#news-id(\d+)\.html$ 是規則 news.php?id=$1 是轉發的頁(yè)面
#正則 子表達式 捕獲 反向引用(yòng)
# "news-id33.html"
# 可(kě)以配置多(duō)個規則,匹配的順序是從上到下
RewriteRule news-id(\d+)\.html$ news.php?id=$1
RewriteRule news-id(\d+)\.html$ error.php
</IfModule>
綜合使用(yòng)案例
4. 這個rewrite的規則也直接在 < Direcotry > 段直接配置
<Directory "C:/myenv/apache/htdocs/static3">
#拒絕所有(yǒu)的訪問
#Deny from all
Allow from all
#是否顯示列表(在發布項目後一般是不啓用(yòng),對于這個配置,針對 DocumentRoot在htdos外的目錄生效)
#Options +indexes
#是否啓用(yòng)rewrite
Allowoverride all
#我們有(yǒu)時候,也可(kě)以把rewrite機制和規則寫這裏
#RewriteEngine On
#RewriteRule news-id(\d+)\.html$ news.php?id=$1
</Directory>
使用(yòng)僞靜态來完成簡單的新(xīn)聞查詢.
☞ 僞靜态是站在seo角度看.,他(tā)對于的頁(yè)面不是存在的,而是每次查詢數據庫得到的信息,
真靜态的頁(yè)面是真的存在.
如果隻是為(wèi)了seo, 完全不希望有(yǒu)html ,那就隻使用(yòng) 僞靜态.
如果的網址要seo ,項目 數據大(1000 w) 你就希望僞靜态同時ob 來緩存.
如何更好的使用(yòng) 僞靜态+ob
在windows 下
① 編寫一個 clear.php 文(wén)件,可(kě)以去檢測某個目錄下的文(wén)件是否過期
② 在編寫my.bat文(wén)件
"C:\\myenv\\apache\\bin\\ab.exe" -n 1 -c 1
③ 在windows使用(yòng)任務(wù)計劃.
④ ok
在linux
使用(yòng)crontab 參看 linux視頻.
面試題: 請說明一下僞靜态和真靜态的特點和區(qū)别
①真靜态訪問效率高,利于seo.可(kě)以減少對數據庫的操作(zuò)。但是會占用(yòng)大量
的磁盤.
②僞靜态一、可(kě)以方便的實現對搜索引擎的優化,二、占空間比較小(xiǎo)。三、通過生成不同view-id2.hmtl 可(kě)以實現内容的變化.四有(yǒu)效的防止了注入攻擊
小(xiǎo)結: 如果一個網頁(yè)會被頻繁的訪問(比如百萬級别),通過該網頁(yè)每次都會去操作(zuò)數據庫,可(kě)以考慮使用(yòng)真靜态(建議有(yǒu)針對性的使用(yòng)),如果一個網頁(yè)為(wèi)了實現對搜索引擎的優化,提供網站的安(ān)全性,使用(yòng)僞靜态.
補充知識 php中(zhōng)如何 使用(yòng)正則表達式?
<?php
//案例
$str="akfdka1234 kafdla 9000";
//需求: 把 四個連續的數找到
//preg_match 函數隻匹配第一個目标,$arr[0] 就存放匹配到得結果,
//$arr[1] 會匹配 模式中(zhōng)第一個子表達式的結果
//$arr[n] 會匹配 模式中(zhōng)第n個子表達式的結果
preg_match("/(\d\d)(\d\d)/si",$str,$arr);
echo "<pre>";
print_r($arr);
echo "</pre>";
//preg_match_all 函數匹配所有(yǒu)目标,$arr[0] 就存放匹配到得所有(yǒu)結果,
//$arr[0][1] 存放第一個匹配的結果
//$arr[0][n] 存放第n個匹配的結果
//$arr[1][0] 放入第一個匹配到得結果中(zhōng)的第一個子表達式的結果
//$arr[1][n] 放入第n+1個匹配到得結果中(zhōng)的第一個子表達式的結果
preg_match_all('/(\d\d)(\d\d)/si',$str,$arr);
echo "<pre>";
print_r($arr);
echo "</pre>";
$str="111-999-444 ka345-900-890 jdl90akjdfals";
preg_match('/(\d)\1{2}-(\d)\2{2}-(\d)\3{2}/si',$str,$arr);
echo "<pre>";
print_r($arr);
echo "</pre>";