Etag快取在PHP和NodeJS中的實現

2021-09-22 08:53:36 字數 2540 閱讀 7676

http 提供了許多頁面快取的方案,其中屬 etag 和 last-modified 應用最廣。本文會先介紹 etag 的應用場景,然後說說他在 php 和 node 中的使用。

客戶端和瀏覽器之間的互動:

+---------+       1         +---------+

| |---------------->| |

| | 2(200,ok) | |

| |

| 客 | 3(etag) | 服 |

| |---------------->| |

| 戶 | 4(304) | 務 |

| |

| 端 | 3(強制重新整理) | 端 |

| |---------------->| |

| | 6(200,ok) | |

| |

+---------+ +---------+

1. 客戶端向伺服器請求資源s

2. 伺服器返回資料,並帶上乙個 etag

3. 客戶端再次請求資源s,由於上次伺服器給他返回了乙個 etag,這次請求的時候他會帶上這個 etag

4. 伺服器發現請求中包含 etag,判斷是否過期,沒過期則返回 304 not modified

5. 客戶端強制重新整理(如chrome中ctrl+shift+r重新整理頁面),請求中剔除 etag

6. 伺服器未發現請求中包含 etag,返回資源s,並帶上乙個 etag

第一次請求資料:

瀏覽器在接受到伺服器發過來的 etag 後,會儲存下來,下次請求的時候會將它放在請求頭中,其 key 值為 if-none-match。

伺服器拿到 if-none-match 之後,對比之前的 etag,如果沒變,則返回 304 not modified.

1. php 中的 etag

etag 是乙個字串,我們一般使用該請求對應響應輸出的 md5 值作為 etag,可以簡單地理解為檔案的版本號。在 php 中存在兩個獲取 md5 的函式,乙個是針對字串的,就是md5(),然後就是針對檔案的,md5_file()

首先判斷在請求中是否包含 'http_if_none_match' 這個 key,如果包含並且其值為之前的 md5 值,則返回 304,否則輸出 etag 以及內容。

2. node 中的 etag

與 php 有些不同,從 $_server 中拿到的內容是經過 apache 包裝過的,而 node 獲取的資料是最原始的。

上面對 hashstr(輸出的內容) 進行了簡單的處理,並將其作為 etag 放在 head 中輸出,上面的**一目了然,我就不解釋了。

etag 在快取處理中用的比較廣泛,使用它可以減少一些不必要請求的頻寬的占用。伺服器輸出的內容不變,瀏覽器就應該使用快取,沒必要每次都向伺服器端索要資料,造成不必要的浪費。

從上面我們可以看到,如果想拿到 etag,就必須先拿到要輸出的資料,所以 etag 只能減少頻寬的占用,並不能降低伺服器的消耗。如果是靜態頁面,可以判斷檔案最近一次的修改時間(last-modified),獲取檔案上次修改時間的消耗比拿到整個資料的消耗要小的多。所以很多時候 etag 都是配合這 last-modified 一起使用的。

上面的 php 和 node **演示,很明顯的差異就是,node 更加細緻,或者說他更加底層,我們可以獲取的幾乎都是未加修飾的原始資料,從資料量的互動和可操控性來看,我更偏向於 node 的使用。

php和node的差異(1) 函式作用域

php中,函式內變數作用域限制在花括號裡。node中,函式內變數作用域,可以取函式外的變數的值。當然,共同點是,外面都不能取裡面的值。php s 123 function test test 上面 的列印結果是 notice undefined variable s in d workspace u...

PHP 不快取頁面和後退無效

客戶端新增如下 或者在 php服務端新增如下 header cache control no cache,must revalidate,no store 這個no store加了之後,firefox下有效 header pragma no cache header expires wed,23 a...

php中Apc和memcache快取資料效能對比

由於是在專案基礎上測試,不方便貼出測試 見諒.如果對測試結果不認同,請提供測試方法及資料,互相學習.論壇討論,再實驗,得出結果 apc.user entries hint這個配置用來調整使用者快取變數數量,當此值調到足夠大後,web環境下apc效能與cli模式下一致.均遠高於memcache.論壇帖...