首页  >  文章  >  后端开发  >  如何使用 PHP 为具有静态内容的动态网站有效实现 HTTP 缓存?

如何使用 PHP 为具有静态内容的动态网站有效实现 HTTP 缓存?

Patricia Arquette
Patricia Arquette原创
2024-11-04 09:35:01728浏览

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-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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn