PHP中使用header函数设置浏览器缓存详解
在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步:理解执行流程与结果
- 获取基准时间:通过SQL聚合函数提取任务表的最后操作时间戳,确定资源的真实生命周期起点。
- 计算缓存窗口:将秒数转换为整数(如6小时的3600*6=21600秒),作为
max-age的值。 - 格式化输出:
gmdate('r')按HTTP规范生成正确的日期格式字符串(RFC 2822)。 - 客户端行为:浏览器在有效期内直接使用本地副本;过期后自动发送带有
If-Modified-Since的请求,服务器比对时间后返回304或直接返回新数据。
排错与建议
- 确保代码头部无任何输出(包括空格或BOM编码),否则
header()调用会失效。 - 调试时可临时将
$interval设为0,验证缓存是否立即失效。 - 生产环境务必使用实际数据库凭证替换示例中的占位符,并开启错误抑制(
@符号仅限调试期参考)。
以上就是PHP中使用header函数设置浏览器缓存的详细内容,更多关于PHP HTTP缓存控制的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













