首页  >  文章  >  后端开发  >  如何通过 PHP 有效利用 HTTP 标头进行缓存?

如何通过 PHP 有效利用 HTTP 标头进行缓存?

Susan Sarandon
Susan Sarandon原创
2024-11-04 03:03:29941浏览

How can I effectively leverage HTTP headers for caching with PHP?

了解 PHP 标头的 HTTP 缓存

问:哪些 HTTP 标头对于 PHP 的有效缓存至关重要?

A: 在为网站实现 HTTP 缓存时,特定标头在指导浏览器如何管理缓存内容方面发挥着至关重要的作用。基本标头包括:

  • Vary: 此标头指定内容根据语言或用户代理等参数而变化,确保浏览器检索适当的缓存版本。
  • Last-Modified: 表示内容最后一次修改时间。浏览器会将此值与后续请求中的 If-Modified-Since 标头进行比较,以确定内容是否需要刷新。
  • ETag: 此标头表示内容的实体标记或校验和。浏览器会将此值与 If-None-Match 标头进行比较,以避免重新请求未更改的内容。

实现:

  1. 设置缓存策略:

    <code class="php">session_cache_limiter('private_no_expire'); // Allow caching but do not reveal cache expiry time</code>
  2. 设置过期时间:

    <code class="php">header("Cache-Control: max-age=" . (60 * 60 * 24 * 30)); // Set cache expiration to 30 days</code>
  3. 管理 If-Modified-Since 和 If-None-Match 标头:
    将这些标头的值与 Last-Modified 和 ETag 标头进行比较,以避免不必要的重新请求:

    <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 && $if_none_match == $etag) || (!$if_none_match)) &&
        ($if_modified_since && $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