当前位置:首页 > PHP

php 实现协商缓存

2026-02-16 03:18:45PHP

php 实现协商缓存

php 实现协商缓存

协商缓存实现原理

协商缓存通过服务器与浏览器之间的HTTP头交互实现,主要依赖Last-Modified/If-Modified-SinceETag/If-None-Match两组头部。当资源未变化时返回304状态码,减少数据传输。

基于Last-Modified的实现

$filePath = 'path/to/resource.txt';
$lastModified = filemtime($filePath);
$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 0;

header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModified) . " GMT");

if ($lastModified <= $ifModifiedSince) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}

header("Content-Type: text/plain");
readfile($filePath);

基于ETag的实现

$filePath = 'path/to/resource.txt';
$fileContent = file_get_contents($filePath);
$eTag = md5($fileContent);
$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) : '';

header("ETag: $eTag");

if ($ifNoneMatch === $eTag) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}

header("Content-Type: text/plain");
echo $fileContent;

组合使用两种策略

$filePath = 'path/to/resource.txt';
$lastModified = filemtime($filePath);
$fileContent = file_get_contents($filePath);
$eTag = md5($fileContent);

$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 0;
$ifNoneMatch = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) : '';

header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModified) . " GMT");
header("ETag: $eTag");

if (($lastModified <= $ifModifiedSince) || ($ifNoneMatch === $eTag)) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}

header("Content-Type: text/plain");
echo $fileContent;

注意事项

确保在发送304响应前没有输出任何内容 对于动态内容,需要手动计算ETag或Last-Modified值 ETag比Last-Modified更精确,能检测到秒级内的修改 某些CDN会对ETag进行特殊处理,需测试兼容性

标签: 缓存php
分享给朋友:

相关文章

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class…

php 实现https

php 实现https

在 PHP 中实现 HTTPS 确保 PHP 应用通过 HTTPS 协议安全传输数据,可以通过以下几种方式实现: 配置服务器强制 HTTPS 在 Web 服务器(如 Apache 或 Nginx)中…