欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Etag和Expires 性能調(diào)優(yōu)

 更新時間:2013年01月12日 16:17:53   作者:  
本文對頁面中Etag和Expires標識處理,使得頁面更加有效被Cache
1、Etag和Expires中Client 端Http Request Header及Server端Http Reponse Header工作原理。
2、靜態(tài)下Apache、Lighttpd和Nginx中Etag和Expires配置
3、非實時交互動態(tài)頁面中Etag和Expires處理
在客戶端通過瀏覽器發(fā)出第一次請求某一個URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務器傳送報頭(Http Request Header),服務器端響應同時記錄相關屬性標記(Http Reponse Header),服務器端的返回狀態(tài)會是200,格式類似如下:
HTTP/1.1 200 OK
Date: Tue, 03 Mar 2009 04:58:40 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″

客戶端第二次請求此URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務器傳送報頭(Http Request Header),服務器端響應并記錄相關記錄屬性標記文件沒有發(fā)生改動,服務器端返回304,直接從緩存中讀?。?BR>HTTP/1.x 304 Not Modified
Date: Tue, 03 Mar 2009 05:03:56 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″
其中Last-ModifiedExpiresEtag是標記頁面緩存標識

一、Last-Modified、Expires和Etag相關工作原理
1、Last-Modified
在瀏覽器第一次請求某一個URL時,服務器端的返回狀態(tài)會是200,內(nèi)容是你請求的資源,同時有一個Last-Modified的屬性標記(Http Reponse Header)此文件在服務期端最后被修改的時間,格式類似這樣:
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客戶端第二次請求此URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務器傳送 If-Modified-Since 報頭(Http Request Header),詢問該時間之后文件是否有被修改過:
If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如果服務器端的資源沒有變化,則自動返回 HTTP 304 (NotChanged.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。當服務器端代碼發(fā)生改變或者重啟服務器時,則重新發(fā)出資源,返回和第一次請求時類似。從而保證不向客戶端重復發(fā)出資源,也保證當服務器有變化時,客戶端能夠得到最新的資源。
注:如果If-Modified-Since的時間比服務器當前時間(當前的請求時間request_time)還晚,會認為是個非法請求

2、Etag工作原理
HTTP 協(xié)議規(guī)格說明定義ETag為"被請求變量的實體標記" (參見14.19)。簡單點即服務器響應時給請求URL標記,并在HTTP響應頭中將其傳送到客戶端,類似服務器端返回的格式:
Etag: "5d8c72a5edda8d6a:3239″
客戶端的查詢更新格式是這樣的:
If-None-Match: "5d8c72a5edda8d6a:3239″
如果ETag沒改變,則返回狀態(tài)304。
即:在客戶端發(fā)出請求后,Http Reponse Header中包含 Etag: "5d8c72a5edda8d6a:3239″
標識,等于告訴Client端,你拿到的這個的資源有表示ID:5d8c72a5edda8d6a:3239。當下次需要發(fā)Request索要同一個URI的時候,瀏覽器同時發(fā)出一個If-None-Match報頭( Http RequestHeader)此時包頭中信息包含上次訪問得到的Etag: "5d8c72a5edda8d6a:3239″標識。
If-None-Match: "5d8c72a5edda8d6a:3239"
,這樣,Client端等于Cache了兩份,服務器端就會比對2者的etag。如果If-None-Match為False,不返回200,返回304 (Not Modified) Response。

3、Expires
給出的日期/時間后,被響應認為是過時。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified結合使用。用于控制請求文件的有效時間,當請求數(shù)據(jù)在有效期內(nèi)時客戶端瀏覽器從緩存請求數(shù)據(jù)而不是服務器端. 當緩存中數(shù)據(jù)失效或過期,才決定從服務器更新數(shù)據(jù)。

4、Last-Modified和Expires
Last-Modified標識能夠節(jié)省一點帶寬,但是還是逃不掉發(fā)一個HTTP請求出去,而且要和Expires一起用。而Expires標識卻使得瀏覽器干脆連HTTP請求都不用發(fā),比如當用戶F5或者點擊Refresh按鈕的時候就算對于有Expires的URI,一樣也會發(fā)一個HTTP請求出去,所以,Last-Modified還是要用的,而 且要和Expires一起用。

5、Etag和Expires
如果服務器端同時設置了Etag和Expires時,Etag原理同樣,即與Last-Modified/Etag對應的HttpRequest Header:If-Modified-Since和If-None-Match。我們可以看到這兩個Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之后,服務器才能返回304.

6、Last-Modified和Etag
Last-Modified 和ETags請求的http報頭一起使用,服務器首先產(chǎn)生 Last-Modified/Etag標記,服務器可在稍后使用它來判斷頁面是否已經(jīng)被修改,來決定文件是否繼續(xù)緩存
過程如下:
1. 客戶端請求一個頁面(A)。
2. 服務器返回頁面A,并在給A加上一個Last-Modified/ETag。
3. 客戶端展現(xiàn)該頁面,并將頁面連同Last-Modified/ETag一起緩存。
4. 客戶再次請求頁面A,并將上次請求時服務器返回的Last-Modified/ETag一起傳遞給服務器。
5. 服務器檢查該Last-Modified或ETag,并判斷出該頁面自上次客戶端請求之后還未被修改,直接返回響應304和一個空的響應體。
注:
1、Last-Modified和Etag頭都是由Web Server發(fā)出的Http Reponse Header,Web Server應該同時支持這兩種頭。
2、Web Server發(fā)送完Last-Modified/Etag頭給客戶端后,客戶端會緩存這些頭;
3、客戶端再次發(fā)起相同頁面的請求時,將分別發(fā)送與Last-Modified/Etag對應的Http RequestHeader:If-Modified-Since和If-None-Match。我們可以看到這兩個Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;
4、通過上述值到服務器端檢查,判斷文件是否繼續(xù)緩存;

二、Apache、Lighttpd和Nginx中針配置Etag和Expires,有效緩存純靜態(tài)如css/js/pic/頁面/流媒體等文件。
A、Expires
A.1、Apache Etag
使用Apache的mod_expires 模塊來設置,這包括控制應答時的Expires頭內(nèi)容和Cache-Control頭的max-age指令
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/html "access plus 30 minutes"
ExpiresByType text/css  "access plus 30 minutes"
ExpiresByType text/txt  "access plus 30 minutes"
ExpiresByType text/js   "access plus 30 minutes"
ExpiresByType application/x-javascript   "access plus 30 minutes"
ExpiresByType application/x-shockwave-flash     "access plus 30 minutes"

<ifmodule mod_expires.c>
<filesmatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>
當設置了expires后,會自動輸出Cache-Control 的max-age 信息
具體關于 Expires 詳細內(nèi)容可以查看Apache官方文檔。
在這個時間段里,該文件的請求都將直接通過緩存服務器獲取,
當然如果需要忽略瀏覽器的刷新請求(F5),緩存服務器squid還需要使用 refresh_pattern 選項來忽略該請求
refresh_pattern -i \.gif$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpeg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.png$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.bmp$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.htm$ 60 100% 100 ignore-reload
refresh_pattern -i \.html$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.xml$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.txt$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.css$ 1440 50% 28800 reload-into-ims
refresh_pattern -i \.js$ 60 50% 100 reload-into-ims
refresh_pattern . 10 50% 60
有關Squid中Expires的說明,請參考Squid官方中refresh_pattern介紹。

A.2、Lighttpd Expires
和Apache一樣Lighttpd設置expire也要先查看是否支持了mod_expire模塊,
下面的設置是讓URI中所有images目錄下的文件1小時后過期;
expire.url = ( "/images/" => "access 1 hours" )
下面是讓作用于images目錄及其子目錄的文件;
$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 1 hours" )
}
也可以指定文件的類型;
$HTTP["url"] =~ "\.(jpg|gif|png|css|js)$" {
expire.url = ( "" => "access 1 hours" )
}
具體參考Lighttpd官方Expires解釋

A.3、Nginx中Expires
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
這類文件并不常修改,通過 expires 指令來控制其在瀏覽器的緩存,以減少不必要的請求。 expires 指令可以控制 HTTP 應答中的" Expires "和" Cache-Control "的頭標(起到控制頁面緩存的作用)。其他請參考Nginx中Expires

B.1、Apache中Etag設置
在Apache中設置Etag的支持比較簡單,只用在含有靜態(tài)文件的目錄中建立一個文件.htaccess, 里面加入:
FileETag MTime Size
這樣就行了,詳細的可以參考Apache的FileEtag文檔頁

B.2、Lighttpd Etag
在Lighttpd中設置Etag支持:
etag.use-inode: 是否使用inode作為Etag
etag.use-mtime: 是否使用文件修改時間作為Etag
etag.use-size: 是否使用文件大小作為Etag
static-file.etags: 是否啟用Etag的功能
第四個參數(shù)肯定是要enable的, 前面三個就看實際的需要來選吧,推薦使用修改時間

B.3、 Nginx Etag
Nginx中默認沒有添加對Etag標識.Igor Sysoev的觀點"在對靜態(tài)文件處理上看不出如何Etag好于Last-Modified標識。"
Note:
Yes, it's addition,and it's easy to add, however, I do not see howETag is better than Last-Modified for static files. -Igor Sysoev
A nice short description is here:
http://www.mnot.net/cache_docs/#WORK
It looks to me that it makes some caches out there to cache theresponse from the origin server more reliable as in rfc2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt) is written.
3.11 Entity Tags 13.3.2 Entity Tag Cache Validators 14.19 ETag
當然也有第三方nginx-static-etags 模塊了,請參考
http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx

三、對于非實時交互動態(tài)頁面中Epires和Etag處理
對數(shù)據(jù)更新并不頻繁、如tag分類歸檔等等,可以考慮對其cache。簡單點就是在非實時交互的動態(tài)程序中輸出expires和etag標識,讓其緩存。但需要注意關閉session,防止http response時http header包含session id標識;
3.1、Expires
如expires.php
<?php
header('Cache-Control: max-age=86400,must-revalidate');
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
header("Expires: " .gmdate ('D, d M Y H:i:s', time() + '86400′ ). ' GMT');
?>
以上信息表示該文件自請求后24小時后過期。
其他需要處理的動態(tài)頁面直接調(diào)用即可。
3.2、Etag
根據(jù)Http返回狀態(tài)來處理。當返回304直接從緩存中讀取
如etag.php
<?php
cache();
echo date("Y-m-d H:i:s");
function cache()
{
$etag = "http://www.dbjr.com.cn";
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header('Etag:'.$etag,true,304);
exit;
}
else header('Etag:'.$etag);
}
?>

我們知道合理配置etag能節(jié)省不少帶寬。
事實上,配置etag緩存并沒有配置Last-Modified header 效果好。
當我們并不知道修改時間,Etag對動態(tài)內(nèi)容還是比較有用。

手機之家高春輝關于etag補充:
幾個不同或者需要補充的地方:
1、“當然,Etag 對多數(shù)站點性能的影響并不是很大。”應該說 Etag 在正確使用的情況下,會讓大量的請求以 304 頭方式響應,可以相當?shù)墓?jié)省服務器資源和帶寬。之前一些地方寫的不要使用 Etag,是基于有些 webserver 的 Etag 的計算方法中包含了 inode,這在多臺web服務器的情況不可采用的,而改變這個計算方法就可以了。
2、對于盡早刷新這點,PHP 幾乎是做不到的。即使你執(zhí)行了 flush 以及類似的函數(shù),也要等到請求完全執(zhí)行之后,才會輸出給瀏覽器端。
3、AJAX 使用 GET 和 POST 各有好處,GET 方式可以更快響應,但是可能會有被瀏覽器緩存的問題,一般都需要加個隨機數(shù)來避免,POST 方式則不會。所以最好是根據(jù)自己的情況分別使用 GET 和 POST 方法。

相關文章

  • win10 docker-toolsbox 搭建php開發(fā)環(huán)境的教程

    win10 docker-toolsbox 搭建php開發(fā)環(huán)境的教程

    這篇文章主要介紹了win10 docker-toolsbox 搭建php開發(fā)環(huán)境的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Flink實踐Savepoint使用示例詳解

    Flink實踐Savepoint使用示例詳解

    這篇文章主要為大家介紹了Flink實踐Savepoint使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 服務器定時執(zhí)行計劃任務,定時訪問頁面(windows/linux)

    服務器定時執(zhí)行計劃任務,定時訪問頁面(windows/linux)

    最近在做一個網(wǎng)站需要定時生成sitemap,如果人工操作容易忘記,不如服務器上自動執(zhí)行生成更方便,其實很簡單一句話就ok了,還支持參數(shù)
    2016-11-11
  • git修改和刪除功能_動力節(jié)點Java學院整理

    git修改和刪除功能_動力節(jié)點Java學院整理

    這篇文章主要介紹了git修改和刪除功能,需要的朋友可以參考下
    2017-08-08
  • 一文讓你知道服務器是什么

    一文讓你知道服務器是什么

    服務器指的是網(wǎng)絡環(huán)境下能為其它客戶機(如PC機、智能手機、ATM等終端甚至是火車系統(tǒng)等大型設備)提供某種服務的專用計算機,它比普通計算機運行更快、負載更高、價格更貴,服務器具有高速的CPU運算能力、長時間的可靠運行、強大的I/O外部數(shù)據(jù)吞吐能力以及更好的擴展性
    2023-08-08
  • 磁盤陣列RAID講解

    磁盤陣列RAID講解

    現(xiàn)在服務器為了安全與性能考慮都會使用多個硬盤做陣列,一般情況下raid1或raid5用的多,這里就為大家介紹一下磁盤陣列的優(yōu)缺點,需要的朋友可以參考下
    2018-05-05
  • 快速分辨清楚 IaaS、PaaS、BaaS和SaaS

    快速分辨清楚 IaaS、PaaS、BaaS和SaaS

    上到BAT的百度云、騰訊云、阿里云,再到各大手機廠商的華為云、OPPO云、聯(lián)想云,甚至電商里的京東云、蘇寧云等等。一時間,仿佛誰家不出一個云服務就不好意思說自己是互聯(lián)網(wǎng)企業(yè)
    2017-06-06
  • ISAPI-REWRITE偽靜態(tài)規(guī)則寫法以及說明

    ISAPI-REWRITE偽靜態(tài)規(guī)則寫法以及說明

    ISAPI-REWRITE偽靜態(tài)規(guī)則寫法以及說明,很多朋友對rewrite的規(guī)則不太熟悉,這里介紹下,方便需要的朋友
    2012-06-06
  • Dell PowerEdge服務器工具下載集合

    Dell PowerEdge服務器工具下載集合

    這篇文章主要介紹了Dell PowerEdge服務器工具下載集合 ,需要的朋友可以參考下
    2016-04-04
  • SSH客戶端連接遠程服務器的操作方法

    SSH客戶端連接遠程服務器的操作方法

    這篇文章主要介紹了SSH客戶端連接遠程服務器的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論