Http 1.1 Etag 與 Last-Modified提高php效率
在 Blog 盛行的今天,一些 Web 應(yīng)用需要解析大量的 RSS Feed .如何提高效率是個(gè)非常重要的問題.在 MagpieRSS 的 Features 中列舉了這樣的一條: HTTP Conditional GETs Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 這里的 Etag 引起了我的注意.
什么是 Etag ?
通過閱讀 RFC 2616 ,得到了對(duì) Etag 的一點(diǎn)印象:
The ETag response-header field provides the current value of the entity tag for the requested variant......Entity tags are normally "strong validators," but the protocol provides a mechanism to tag an entity tag as "weak." One can think of a strong validator as one that changes whenever the bits of an entity changes, while a weak value changes whenever the meaning of an entity changes. Alternatively, one can think of a strong validator as part of an identifier for a specific entity, while a weak validator is part of an identifier for a set of semantically equivalent entities.
從上我們可以大致得知,Entity tags 本質(zhì)上說是一種"強(qiáng)校驗(yàn)器",但是 HTTP 協(xié)議提供了一種通過給 Entity tags 打標(biāo)簽的"弱"的機(jī)制(類似于內(nèi)容的校驗(yàn)碼).雖然這段話后面通過兩種方式進(jìn)行了解釋,但是還是有些晦澀.我看了這段話之后只是得出了 Etag 的 "E" 代表 "Entity" 而已.
Magpie 首頁(yè)上提到了一篇文章: HTTP Conditional Get for RSS Hackers ,拜讀之后清晰了許多.要先說說 HTTP Conditional GETs 的基本原理,很簡(jiǎn)單,就是說,從 Web 服務(wù)器取數(shù)據(jù)的時(shí)候,如果文件變化了,給我新的文件,如果文件沒有變化,只需告訴客戶端沒有變化即可,不必再把文件取回來.這樣就可節(jié)省大量的網(wǎng)絡(luò)帶寬和資源.
Etag 與 Last-Modified 是從 HTTP 1.0 到 HTTP 1.1 才有的概念.當(dāng)我們從 Web 服務(wù)器獲取文件的時(shí)候,只需要讀取 HTTP 響應(yīng)頭的 Etag 與 Last-Modified 字段即可,這兩個(gè)字段里面的具體內(nèi)容是什么可以不管(可能會(huì)千奇百怪,RFC 2616 對(duì) Etag 沒有具體值的定義),把這兩個(gè)值 Cache 在本地,下次檢查文件是否更新的時(shí)候比對(duì)這兩個(gè)值即可.如果沒有變化,服務(wù)器的響應(yīng)代碼不是 HTTP 200 (OK) , 而是 304.
如上圖.目前 OpenRSS 雖然訂閱了40 多個(gè) Feed,但是響應(yīng)速度很不錯(cuò).在使用 Gregarius 的過程中(Lilina 也應(yīng)用了 ETag),發(fā)現(xiàn)了 FeedBurnrer 燒錄的 Feed ,幾乎都是用了 Etag 的(否則估計(jì)服務(wù)器要癱瘓,Hoho).我們?cè)贉y(cè)試一下 HTTP header 的響應(yīng)情況:
$ curl -I http://feeds.feedburner.com/dbanotes HTTP/1.1 200 OK Date: Tue, 25 Oct 2005 11:34:15 GMT Server: Apache Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT ETag: U4q478bDKLqZ8UMMC8A5afZuHug Content-Type: text/xml;charset=utf-8 $ curl -I http://feeds.feedburner.com/dbanotes HTTP/1.1 200 OK Date: Tue, 25 Oct 2005 11:34:21 GMT Server: Apache Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT ETag: U4q478bDKLqZ8UMMC8A5afZuHug Content-Type: text/xml;charset=utf-8
在這個(gè)期間,我的 Blog 沒有更新.所以 Last-Modified 和 ETag 返回的都是相同的值.這樣 Gregarius 就不必重新解析了. 國(guó)內(nèi)的 GreatNews 是支持 HTTP Conditional GETs 的,更棒的是還支持 gzip/deflate encoding.而另一個(gè) RSS 閱讀工具 POPU (周博通) 就不知道了.
以上是我的筆記,如有理解錯(cuò)誤,請(qǐng)指正!
相關(guān)文章
自己寫了一個(gè)php檢測(cè)文件編碼的函數(shù)
關(guān)于文件編碼的檢測(cè),百度一下一大把都是,但是確實(shí)沒有能用的,下面是自己寫了一個(gè)檢測(cè)函數(shù),希望對(duì)大家有所幫助2014-04-04
php 5.3.5安裝memcache注意事項(xiàng)小結(jié)
必須注意php的編譯版本,下載memcache的時(shí)候注意要使用同樣的編譯版本;比如php是使用vc6編譯的,那么memcache也應(yīng)該使用vc6編譯版本。2011-04-04
php中判斷一個(gè)字符串包含另一個(gè)字符串的方法
這篇文章主要為大家分享一下一個(gè)字符串包含另一個(gè)字符串的方法,主要使用了strpos或數(shù)組的方法實(shí)現(xiàn)2007-03-03
并發(fā)下常見的加鎖及鎖的PHP具體實(shí)現(xiàn)代碼
用到了Eaccelerator的內(nèi)存鎖 和 文件鎖,原理如下判斷系統(tǒng)中是否安了EAccelerator 如果有則使用內(nèi)存鎖,如果不存在,則進(jìn)行文件鎖2010-10-10
PHP如何限制定時(shí)任務(wù)的進(jìn)程數(shù)量
這篇文章主要給大家介紹了關(guān)于PHP如何限制定時(shí)任務(wù)進(jìn)程數(shù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
PHP刪除二維數(shù)組中相同元素及數(shù)組重復(fù)值的方法示例
這篇文章主要介紹了PHP刪除二維數(shù)組中相同元素及數(shù)組重復(fù)值的方法,涉及php針對(duì)數(shù)組的遍歷、判斷、比較等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
php-fpm開啟狀態(tài)統(tǒng)計(jì)的方法詳解
這篇文章主要給大家介紹了php-fpm開啟狀態(tài)統(tǒng)計(jì)的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
php中通過Ajax如何實(shí)現(xiàn)異步文件上傳的代碼實(shí)例
php結(jié)合Ajax技術(shù)如何實(shí)現(xiàn)異步文件上傳 有了file filereader 對(duì)象的支持,異步文件上傳將變得簡(jiǎn)單。(以前都會(huì)把form提交到iframe來實(shí)現(xiàn))2011-05-05

