PHP Header 缓存的示例
什么是 Header 缓存?
HTTP Header 缓存是指服务器在响应(如 HTML,CSS,JavaScript,图像等)中添加特定响应头,以利用浏览器对请求的缓存机制。通过使用缓存,每次请求时,浏览器可以轻松地检查响应是否更改。如果响应没有更新,则浏览器可以使用缓存而无需再次请求新的响应,从而显着减少了页面加载时间。
为什么我们应该使用 Header 缓存?
下面是一些判断是否需要使用 HTTP 缓存的方法:
我们有很多的静态资源,如图像,CSS和JavaScript,这些文件往往相对不去变化,其内容不随时间变更而变更。
我们的页面的缓存过期时间足够长。一般情况下,缓存过期时间应该设置在24小时以上。
我们的页面有一个合理的缓存键(缓存标识符)。在这里,我们可以使用 E-Tag、Last-Modified 或使用来自应用程序的定制缓存键。
Header 缓存示例
下面的例子演示如何使用 PHP 添加 HTTP 缓存到我们的响应中。我们将加入 Last-Modified 响应头以利用浏览器的缓存机制。
$last_modified_time = filemtime('file.txt');
$etag = md5_file('file.txt');
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
// 继续处理请求,发送最新的版本
在这个例子中:
// 获取文件最后的修改时间
$last_modified_time = filemtime('file.txt');
// 获取文件内容的 MD5 摘要,作为缓存键
$etag = md5_file('file.txt');
// 发送 Last-Modified 和 Etag 响应头
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
// 检查请求的 If-Modified-Since 头字段和 If-None-Match 头字段
if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
// 如果未发生变化,则返回 304 Not Modified
header("HTTP/1.1 304 Not Modified");
exit;
}
// 如果发生变化,则继续处理请求,发送最新的版本
这个例子演示了如何使用缓存控制头来优化网站的性能。通过实现 HTTP 缓存,我们可以显著的提高页面加载时间,并减轻服务器传递元数据的负担。下次,当您考虑如何优化您的网站性能时,请考虑使用 HTTP 缓存。