PHP中如何對輸出的資源檔案使用 Last-Modified 或 ETag

說明:
網頁頁面本身和頁面中的圖片、外部 CSS 檔案、外部 JavaScript 檔案等資源檔案最好在輸出給 client 端 (一般是指瀏覽器) 時明確地在 HTTP 回應的標頭中寫明 Last-Modified 或 ETag 這類快取驗證資訊,讓 client 端可以明確地知道手邊的快取檔案是否已經過期、是否已經改變而需要重新抓取。不需要抓取者則直接使用快取資料以加速網頁的呈現速度。 Last-Modified 和 ETag 是從 HTTP 1.0 到 HTTP 1.1 後才有的新 HTTP 標頭欄位。
這一篇文章是要說明在 PHP 語言中如何對輸出的資源檔案使用 Last-Modified 或 ETag。

在 HTTP 回應中使用 Last-Modified 欄位資訊:

<?php
$iModifiedTm = time();
$sLastModified = gmdate(‘D, d M Y H:i:s’, $iModifiedTm) . ‘ GMT’;
header(“Last-Modified: {$sLastModified}”); //@return most recent last-modified header
?>

上面的範例中用目前時間的 timestamp 當做最後更新的時間 ($iModifiedTm),使用者可根據需求為個別輸出的網頁頁面本身和頁面中的圖片、外部 CSS 檔案、外部 JavaScript 檔案等資源檔案設定適當的 Last-Modified。

在 HTTP 回應中使用 Last-Modified 欄位和 ETag 欄位資訊:

ETag 是用來反應某個網頁頁面本身或頁面中的某資源檔案內容是否已經變更了,當某個(頁面)內容的 ETag 字串和上次收到的一樣時,表示該(頁面)內容沒有變更,client 端可以直接使用快取的內容;當 ETag 字串和上次收到的不一樣時,表示該(頁面)內容已經變更了,client 端要重新抓取新的內容。
ETag 可以是 “強驗證器”,某(頁面)內容有一個 bit 變動會有產生不同的 ETag 字串;或是 ETag 也可以是 “弱驗證器”,某(頁面)內容變動到一定程度時才產生新的 ETag 字串。

以下範例中同時在 HTTP 回應中使用 Last-Modified 欄位和 ETag 欄位資訊:
<?php
$iModifiedTm = time();
$sLastModified = gmdate(‘D, d M Y H:i:s’, $iModifiedTm) . ‘ GMT’;
header(“Last-Modified: {$sLastModified}”); //@return most recent last-modified header
header(“ETag: UXst3Adf56AJfad19D3dupocjrfux5f7”);
?>

注意事項:
o header() 之前不能有任何輸出內容,例如用 echo “test”; 之類的,不然 HTTP 回應的 header 已經先送出了,再去寫 header() 是無法正確運作的。
o 更多的 Etag 資訊請見 RFC 2616

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.