PHP中使用header函数设置浏览器缓存详解

陆景行
陆景行
发布时间:2026-10-15 | 5人浏览过
原创

在Web开发中,合理设置浏览器缓存是降低服务器负载、提升页面加载速度的关键手段。本文将详细介绍如何在PHP中通过header()函数配置HTTP响应头,利用Last-Modified、Expires和Cache-Control等指令,实现对客户端缓存行为的精确控制。

HTTP缓存控制的核心原理

浏览器缓存依赖于服务器返回的HTTP响应头字段。PHP中主要涉及以下四类头标:

  • Last-Modified(最后修改时间):标识资源最后的修改时间。若客户端缓存版本比服务器新,则使用缓存;否则重新获取。
  • Expires(有效期限):指定缓存过期的具体GMT时间。设置为过去时间可强制请求服务器。
  • Pragma(编译指示):主要用于HTTP/1.0兼容,如Pragma: no-cache禁止任何缓存。
  • Cache-Control(缓存控制):HTTP/1.1引入,提供更细致的控制权,建议与HTTP/1.0头标配合使用。

第1步:配置Cache-Control指令参数

Cache-Control支持多种指令组合,可根据场景灵活选用:

指令含义
public可在CDN或代理服务器中缓存
private仅单用户浏览器私有缓存
no-cache强制每次请求都向服务器验证
max-age=N缓存有效期(秒),覆盖Expires
s-maxage=N覆盖共享缓存层(如Varnish)的max-age

第2步:构建动态缓存逻辑

为兼顾时效性与性能,推荐采用“基于内容更新”的动态缓存策略。当数据未变更时返回304状态码,变更时返回新数据。

<?php
// 连接数据库
$dbc = @mysqli_connect('localhost', 'username', 'password', 'test') OR die('

Database error!

');

// 查询最后更新时间
$q = 'SELECT UNIX_TIMESTAMP(MAX(date_added)), UNIX_TIMESTAMP(MAX(date_completed)) FROM tasks';
$r = mysqli_query($dbc, $q);
list($max_a, $max_c) = mysqli_fetch_array($r, MYSQLI_NUM);

// 取最大值作为资源基准时间
$max = ($max_a > $max_c) ? $max_a : $max_c;

// 设定缓存周期为6小时
$interval = 60 * 60 * 6;

// 发送 Last-Modified 头标
header("Last-Modified: " . gmdate('r', $max));

// 发送 Expires 过期时间
header("Expires: " . gmdate("r", ($max + $interval)));

// 发送 Cache-Control 控制指令
header("Cache-Control: max-age=$interval");
?>

第3步:理解执行流程与结果

  1. 获取基准时间:通过SQL聚合函数提取任务表的最后操作时间戳,确定资源的真实生命周期起点。
  2. 计算缓存窗口:将秒数转换为整数(如6小时的3600*6=21600秒),作为max-age的值。
  3. 格式化输出:gmdate('r')按HTTP规范生成正确的日期格式字符串(RFC 2822)。
  4. 客户端行为:浏览器在有效期内直接使用本地副本;过期后自动发送带有If-Modified-Since的请求,服务器比对时间后返回304或直接返回新数据。

排错与建议

  • 确保代码头部无任何输出(包括空格或BOM编码),否则header()调用会失效。
  • 调试时可临时将$interval设为0,验证缓存是否立即失效。
  • 生产环境务必使用实际数据库凭证替换示例中的占位符,并开启错误抑制(@符号仅限调试期参考)。

以上就是PHP中使用header函数设置浏览器缓存的详细内容,更多关于PHP HTTP缓存控制的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表