PHPAPI缓存控制头怎么设置

wen PHP项目 2

本文目录导读:

PHPAPI缓存控制头怎么设置

  1. 禁用缓存(API动态数据)
  2. 允许缓存(适合不常变化的数据)
  3. 条件缓存(配合ETag或Last-Modified)
  4. 常用缓存策略示例
  5. 完整的API响应示例
  6. 注意事项

在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);

注意事项

  1. PHP输出前设置:必须在任何输出之前设置头部
  2. session使用:如果使用了session,默认PHP会发送no-cache头,需要注意覆盖
  3. CDN考虑:如果使用CDN,还需要考虑设置 Surrogate-Control
  4. 测试验证:可以使用浏览器的开发者工具或curl命令验证缓存效果
# 测试缓存头
curl -I https://api.example.com/endpoint

选择哪种策略取决于你的API数据更新频率和实时性要求。

抱歉,评论功能暂时关闭!