如何使用 PHP 為具有靜態內容的動態網站有效實作 HTTP 快取?

Patricia Arquette
發布: 2024-11-04 09:35:01
原創
727 人瀏覽過

How can I effectively implement HTTP caching with PHP for dynamic websites with static content?

將HTTP 快取與PHP 整合

在頁面內容主要保持靜態但被動態模板包圍的情況下,利用HTTP 快取標頭可以優化頁面交付。以下是使用PHP 實現有效緩存的簡化指南:

緩存的基本標頭

要啟用緩存,請考慮發送以下標頭:

  • Content-Type:指定回應的MIME類型和字元集。
  • Vary: Accept:表示回應可以依照客戶端的Accept而變化標頭,控制內容協商。
  • Cache-Control: 設定諸如 private_no_expire 之類的指令以允許私有快取但防止重新驗證。或者,使用 public 允許共享快取。
  • Last-Modified: 提供內容上次修改的日期和時間。
  • ETag: 為內容分配一個唯一標識符,客戶端可以使用該標識符來確定快取版本是否仍然是最新的。

條件請求與處理

使用if-modified-sinceif-none-match:

    if-none-match:
  • if-modified-since 處理傳入的條件要求: 將請求標頭與Last-Modified 標頭進行比較。如果快取的版本仍然有效,則傳回 304(未修改)狀態碼。

if-none-match: 依照 ETag 標頭進行驗證。如果快取版本匹配,則傳回 304。

確定快取有效性

產生 ETag 時,考慮使用校驗和或使用者等因素的組合ID、語言和時間戳記。對於更持久的靜態內容,請設定更長的過期時間。

<code class="php">$tsstring = gmdate('D, d M Y H:i:s ', $timestamp) . 'GMT';
$etag = $language . $timestamp;

$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false;
$if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] : false;
if ((($if_none_match &amp;&amp; $if_none_match == $etag) || (!$if_none_match)) &amp;&amp; 
($if_modified_since &amp;&amp; $if_modified_since == $tsstring))
{
header('HTTP/1.1 304 Not Modified');
exit();
}
else
{
header("Last-Modified: $tsstring");
header("ETag: \"{$etag}\"");
}</code>
登入後複製
範例實作

以上是如何使用 PHP 為具有靜態內容的動態網站有效實作 HTTP 快取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!