当前位置:首页 > PHP

php 实现协商缓存

2026-02-16 03:18:45PHP

协商缓存实现原理

协商缓存通过服务器与浏览器之间的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实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或…

vue怎么实现组件缓存

vue怎么实现组件缓存

vue实现组件缓存的方法 在Vue中实现组件缓存可以通过内置的<keep-alive>组件完成,该组件能够缓存不活动的组件实例,避免重复渲染。 使用<keep-alive>基…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现栈

php实现栈

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

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…