当前位置: 首页 > 面试题库 >

如何在PHP中使用HTTP缓存头

汲品
2023-03-14
问题内容

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

页面是动态生成的,但是许多页面大多数是静态的。静态是指内容不变,但是内容周围的“模板”会随着时间而改变。

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

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

session_cache_limiter('private'); //Aim at 'public'
session_cache_expire(180);
header("Content-type: $documentMimeType; charset=$documentCharset");
header('Vary: Accept');
header("Content-language: $currentLanguage");

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

什么是必须发送的标头才能帮助缓存?


问题答案:

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

$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,语言和时间戳记的校验和可能在哪里,例如

$etag = md5($language . $timestamp);


 类似资料:
  • 问题内容: 该CXF文档中提到缓存为高级HTTP: CXF JAXRS通过处理If-Match,If-Modified-Since和ETags标头,提供了对许多高级HTTP功能的支持。JAXRS Request上下文对象可用于检查前提条件。还支持Vary,CacheControl,Cookie和Set-Cookies。 我真的对使用(或至少探索)这些功能感兴趣。但是,尽管“提供支持”听起来确实很有

  • 问题内容: 我已经使用Spring Boot 1.0.2实现了REST服务器。我无法阻止Spring设置禁用HTTP缓存的HTTP标头。 我的控制器如下: 所有HTTP响应均包含以下标头: 我尝试了以下操作来删除或更改这些标头: 调用控制器。 调用控制器。 定义是回报的,我打过电话。 将属性设置为-1或正值。 以上都不起作用。如何在Spring Boot中为所有或单个请求禁用或更改这些标头? 问题

  • 问题内容: 通过WSDL缓存所在的位置(),但我不一定知道删除以WSDL开头的所有文件是否安全。 是的,我 应该 能够从中删除所有内容,但是我不知道如果删除所有WSDL文件,这还会影响什么。 问题答案: 您可以安全地删除WSDL缓存文件。如果希望防止以后进行缓存,请使用: 或动态地:

  • 从我的客户端,我正在从服务器查询一些枚举。现在,我希望在服务器上查询完这些枚举后,立即将其缓存到客户端中。 我尝试设置缓存控制,如下所示: 响应标头似乎已正确设置为缓存控制:最大年龄=3600。我还禁用了安全配置中的所有http头,如下所示: 遗憾的是,响应没有缓存在浏览器中。在查询资源时,查询将再次转到服务器。 同时,我完全删除了Spring Security,但它仍然不起作用。我没有正确理解什

  • 问题内容: 我对如何缓存图像是全新的。 我使用PHP输出图库中的所有图像,并希望已显示的图像由浏览器缓存,因此PHP脚本不必再次输出相同的图像。我想要的只是图像显示得更快。 调用图像时,我喜欢这样: 和-file做: 问题答案: 如果您使用php在输出消息之前检查用户是否已登录,则您不希望浏览器缓存图像。 缓存的全部目的是调用服务器一次,然后再也不调用它。如果浏览器缓存图像,它将不会调用服务器,并