博文原連接php
http://xiaozhuge0825.blog.163.com/blog/static/57606068201222842351928/ chrome
當咱們想盡辦法提升服務器負載能力的時候,是否曾想過,其實瀏覽器也有緩存功能,咱們也能夠利用瀏覽器的緩存功能來減小服務器的負載,提升網站吞吐量?本章咱們就來說講瀏覽器的緩存功能並加以利用。 瀏覽器
當咱們使用抓包工具查看http狀態時,咱們能夠看到200,304,from cache之類的標識,也許你也早已注意到了他們,並明白他們的意思。可是,你是否想過在你的程序中加入代碼主動告訴瀏覽器,更好地利用瀏覽器緩存。 緩存
備註:本章全部案例都是使用chrome 17.0.963.79 m瀏覽器,測試方式爲每次打開瀏覽器新窗口的方式測試,而不是F5刷新。 服務器
咱們先作一個沒有緩存的頁面,叫作nocache.php
代碼以下:併發
<?php
echo time();
?>
用瀏覽器打開,咱們能夠看到每次打開頁面,都是打印新的時間,返回的狀態碼是200,代表在默認狀況下,咱們的瀏覽器沒有使用緩存。ide
咱們再作一個頁面,叫作last_modified.php
代碼以下:工具
<?php
$cache_time = 3600;
$modified_time = @$_SERVER['HTTP_IF_MODIFIED_SINCE'];
if( strtotime($modified_time)+$cache_time > time() ){
header("HTTP/1.1 304");
exit;
}
header("Last-Modified: ".gmdate("D, d M Y H:i:s", time() )." GMT");
echo time();
?>
用瀏覽器打開,咱們能夠看到第一次打開,返回的狀態碼爲200,打印時間爲最新時間。而後咱們第二次打開,能夠看到狀態碼爲304,時間和剛纔的時間同樣,代表咱們是使用到緩存了。咱們刪除last_modified.php文件,而後第三次打開頁面,瀏覽器返回404錯誤,可見Last-Modified雖然使用了緩存,可是每次打開頁面依然須要向服務器發起http請求,瀏覽器根據用戶的$_SERVER['HTTP_IF_MODIFIED_SINCE']來判斷瀏覽器的內容是否過時,沒過時的話返回304狀態,瀏覽器內容從緩存中讀取。測試
咱們再作一個頁面,叫作 expires.php
代碼以下:網站
<?php
$cache_time = 3600;
header("Expires: ".gmdate("D, d M Y H:i:s", time()+$cache_time )." GMT");
echo time();
?>
用瀏覽器打開,咱們能夠看到第一打開,返回的狀態爲200,時間爲最新的時間。而後咱們第二次打開,能夠看到狀態碼依然是200,時間依然是舊的時間,Size欄目顯示爲from cache,表示內容是直接從瀏覽器讀取。咱們刪除expires.php文件,而後第三次在新窗口中打開,能夠看到返回200狀態碼,打印時間依然是舊的,Size依然提示爲from cache,因而可知,設置了Expires,就算刪除頁面,瀏覽器端依然能夠顯示,代表瀏覽器根本就沒有向服務器發起http請求。
到這裏,也許你會感受Expires比Last-Modified緩存效果更好是吧,由於本地有緩存數據時,不須要向服務器發起http請求,服務器的併發數會明顯的減小,能夠少處理不少http請求。可是Expires也有缺點,那就是設置的過時時間是服務器的時間,而不是你本地的時間,這樣若是服務器時間跟你本地時間不一致時,可能並無起到緩存的效果。HTTP/1.1爲了彌補Expirse的不足,引入了Cache-Control標記。格式以下Cache-Control: max-age=<second>,這個時間是相對瀏覽器本地時間,因此更加準確。
咱們再作一個頁面,叫作cached_control.php
代碼以下:
<?php
$cache_time = 3600;
header("Cache-Control: max-age=".$cache_time);
echo time();
?>
咱們測試能夠獲得設置Expires同樣的效果,也就是緩存後,刪除文件,依然在瀏覽器緩存有效期內能夠正常訪問頁面。
好了,over了,下次當你服務器併發過高,服務器資源和帶寬資源不足時,請記住偉大的瀏覽器緩存吧!也許你依然不覺得然,以爲提升服務器的吞吐量有不少辦法,好比在服務器端作緩存,把頁面靜態化,等等。可是我相信有一個東西你應該會在乎,沒錯,就是帶寬,在乎吧?若是能利用好瀏覽器緩存,將能夠下降你的寬帶資源,這樣不是很好嗎。