本文目录导读:

在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数据更新频率和实时性要求。