PHP 304狀態碼指的是在客戶端向服務器發出請求時,服務器在檢查該資源的緩存標記后發現該資源并沒有被修改,因此服務器不會返回該資源,而是返回這個狀態碼。它告訴客戶端可以繼續使用緩存副本,這樣可以減輕服務器的負擔,提高頁面響應速度。
簡單來說,就是服務器告訴客戶端,之前請求的資源還沒有被修改過,緩存還可以使用,不需要重新獲取,可以直接使用緩存副本,以減輕服務器的壓力。
//示例代碼: header('HTTP/1.1 304 Not Modified'); exit();
這個狀態碼的應用場景很廣泛,下面我們分別來看一下在何種情況下會返回304狀態碼。
瀏覽器緩存
瀏覽器在第一次請求服務器的文件時,服務器會返回 200 狀態碼,并且將文件以及相關的元數據一起發送到瀏覽器,比如:Last-Modified 和 Etag(實體標識)。瀏覽器收到這些數據后,會將它們緩存到本地。當瀏覽器下次請求這個資源時,它會將這些元數據一起發送給服務器,服務器從請求頭信息中獲取這些數據,并和服務器上的文件進行比對,如果沒有更改,服務器就返回 304 狀態碼,否則返回最新版本的文件和相關元數據。
//示例代碼: $file = 'test.txt'; // 獲取最后修改時間 $time = filemtime($file); // 發送文件 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT', true, 200); exit();
CDN緩存
CDN(內容分發網絡)緩存是通過 CDN 存儲訪問量大的網站資源,以加快網站的訪問速度。當訪問者請求資源時,CDN 會首先檢查資源是否存在于緩存中。如果存在,CDN 就直接返回緩存中的資源,加速頁面的響應。如果不存在,CDN 就會向源站(服務器)發送請求,并將資源緩存到自己的機器上,以便下次直接從緩存中取出。
在使用 CDN 緩存時,因為 CDN 前端有一個 Varnish 緩存服務器,這個服務器會比源服務器優先被客戶端獲取文件,他會去判斷客戶端請求文件的 Last-Modified 和 Etag 是否和 CDN 緩存服務器的 Last-Modified 和 Etag 相同,如果相同,則直接從 CDN 緩存中返回,否則再去獲取最新版本的文件。
服務器緩存
服務器緩存是指服務器在處理請求時緩存一些資源,使得再次請求時可以直接從緩存中獲取數據而不需要進行復雜的計算。有些服務器,比如 Apache、Nginx,在處理某些腳本時會將結果緩存在內存中,下次同樣的請求就可以直接從內存中讀取,而不需要再次執行相同的腳本。
//示例代碼: // 緩存有效期為一分鐘 $app->expires('+1 minute'); // 判斷緩存是否存在 if ($app->etag($callback)) { $app->etag(); return $app->res->status(304); }
在 Web 開發中,緩存是極其重要的一環。如果你的網站沒有緩存機制,那么每次請求都需要重新計算,響應時間將會非常慢。如果你的網站訪問量很大,你的服務器可能要承受巨大的壓力。這時,緩存就可以起到非常重要的作用,它能夠明顯減輕服務器的負擔,提高頁面響應速度,從而增強用戶體驗。
在捕捉到 304 HTTP 狀態碼時,瀏覽器通過讀取緩存的副本來展示頁面,減少了用戶等待新資源加載的時間。我們應該盡量利用緩存的機制,以減少帶寬的占用和服務器的負荷。在實際開發中,我們需要更加細致地處理緩存,以保證用戶獲取到最新的數據。