本文目录导读:

在PHP中设置API缓存控制头(Cache-Control)主要通过 header() 函数实现,以下是几种常见场景的设置方法:
禁用缓存(API动态数据)
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: 0');
允许缓存(适合不常变化的数据)
// 缓存1小时
header('Cache-Control: public, max-age=3600');
// 或私有缓存(只允许浏览器缓存)
header('Cache-Control: private, max-age=3600');
条件缓存(配合ETag或Last-Modified)
// 设置ETag
$etag = md5($data);
header('ETag: "' . $etag . '"');
// 检查客户端是否发送了If-None-Match
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
trim($_SERVER['HTTP_IF_NONE_MATCH']) === '"' . $etag . '"') {
header('HTTP/1.1 304 Not Modified');
exit;
}
// 或者使用Last-Modified
$lastModified = gmdate('D, d M Y H:i:s', $fileTime) . ' GMT';
header('Last-Modified: ' . $lastModified);
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
$_SERVER['HTTP_IF_MODIFIED_SINCE'] === $lastModified) {
header('HTTP/1.1 304 Not Modified');
exit;
}
常用缓存策略示例
class CacheControl {
// 完全不缓存
public static function noCache() {
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
}
// 强缓存指定时间(秒)
public static function cache($seconds = 3600, $public = true) {
$scope = $public ? 'public' : 'private';
header("Cache-Control: {$scope}, max-age={$seconds}");
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $seconds) . ' GMT');
}
// 验证缓存(需要配合ETag或Last-Modified)
public static function validate($etag = null, $lastModified = null) {
if ($etag) {
header('ETag: "' . $etag . '"');
}
if ($lastModified) {
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
}
}
}
// 使用示例
// API控制器中
CacheControl::noCache(); // 对于动态API
// 或
CacheControl::cache(3600, true); // 对于公开可缓存的数据
完整的API响应示例
function apiResponse($data, $cacheTime = null) {
// 设置内容类型
header('Content-Type: application/json; charset=utf-8');
// 缓存控制
if ($cacheTime !== null) {
header("Cache-Control: public, max-age={$cacheTime}");
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cacheTime) . ' GMT');
} else {
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
}
// CORS头(如果需要)
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
echo json_encode($data);
exit;
}
// 使用
// 用户信息API(不缓存)
apiResponse($userData);
// 产品列表API(缓存5分钟)
apiResponse($productList, 300);
注意事项
- PHP输出前设置:必须在任何输出之前设置头部
- session使用:如果使用了session,默认PHP会发送no-cache头,需要注意覆盖
- CDN考虑:如果使用CDN,还需要考虑设置
Surrogate-Control头 - 测试验证:可以使用浏览器的开发者工具或curl命令验证缓存效果
# 测试缓存头 curl -I https://api.example.com/endpoint
选择哪种策略取决于你的API数据更新频率和实时性要求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播