首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中使用HTTP缓存头

如何在PHP中使用HTTP缓存头
EN

Stack Overflow用户
提问于 2009-12-29 05:43:37
回答 6查看 83.4K关注 0票数 68

我有一个PHP5.1.0的网站(实际上它是5.2.9,但它也必须在5.1.0+上运行)。

页面是动态生成的,但其中许多页面大多是静态的。所谓静态,我的意思是内容不会改变,但内容周围的“模板”可能会随着时间的推移而改变。

我知道他们已经有几个缓存系统和PHP框架了,但是我的主机没有安装APC或Memcached,我也没有在这个特定的项目中使用任何框架。

我希望页面被缓存(我认为在默认情况下PHP“不允许”缓存)。到目前为止,我正在使用:

代码语言:javascript
复制
session_cache_limiter('private'); //Aim at 'public'
session_cache_expire(180);
header("Content-type: $documentMimeType; charset=$documentCharset");
header('Vary: Accept');
header("Content-language: $currentLanguage");

我读了很多教程,但我找不到简单的东西(我知道缓存是很复杂的东西,但我只需要一些基本的东西)。

什么是“必须”发送的头,以帮助缓存?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-29 13:07:55

您可能希望使用private_no_expire而不是private,但是要为您知道不会更改的内容设置较长的过期时间,并确保处理类似于Emil的post的if-modified-sinceif-none-match请求。

代码语言:javascript
复制
$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}\"");
}

其中$etag可以是基于内容或用户ID、语言和时间戳的校验和,例如

代码语言:javascript
复制
$etag = md5($language . $timestamp);
票数 52
EN

Stack Overflow用户

发布于 2009-12-29 07:07:49

您必须具有Expires标头。从技术上讲,还有其他解决方案,但Expires头确实是最好的解决方案,因为它告诉浏览器在到期日期和时间之前不要重新检查页面,只提供缓存中的内容。它工作起来真的很棒!

在浏览器的请求中检查If-Modified- from标头也很有用。当浏览器“不确定”其缓存中的内容是否仍然是正确的版本时,将发送此标头。如果您的页面从那时起就没有被修改过,那么只需返回一个HTTP304代码(未修改)。下面是一个发送304代码10分钟的示例:

代码语言:javascript
复制
<?php
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
  if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) < time() - 600) {
    header('HTTP/1.1 304 Not Modified');
    exit;
  }
}
?>

您可以在代码中提前执行此检查,以节省服务器资源。

票数 13
EN

Stack Overflow用户

发布于 2009-12-29 05:51:41

代码语言:javascript
复制
<?php
header("Expires: Sat, 26 Jul 2020 05:00:00 GMT"); // Date in the future
?>

为缓存的页面设置过期日期是在客户端缓存它的一种有用的方法。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1971721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档