启用 ETag 和 Last-Modified 机制,避免重复加载资源,开发应用案例

发布时间 - 2025-03-12    点击率:61次

在PHP网站开发中,可以通过设置HTTP响应头来启用ETag和Last-Modified机制,从而避免重复加载资源。以下是具体的实现方法:


1. 启用 ETag 和 Last-Modified 的 PHP 代码示例

php
复制
<?php// 假设这是一个静态资源的路径$filePath = 'path/to/your/resource.txt';// 检查文件是否存在if (!file_exists($filePath)) {
    header("HTTP/1.1 404 Not Found");
    exit;}// 获取文件的最后修改时间$lastModified = filemtime($filePath);// 生成 ETag(基于文件大小和最后修改时间)$fileSize = filesize($filePath);$etag = md5($fileSize . '-' . $lastModified);// 设置 Last-Modified 和 ETag 响应头header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModified) . " GMT");header("ETag: $etag");// 检查客户端的 If-None-Match 和 If-Modified-Since 请求头if (
    (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) === $etag) ||
    (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)) {
    // 如果资源未修改,返回 304 Not Modified
    header("HTTP/1.1 304 Not Modified");
    exit;}// 返回资源内容header("Content-Type: " . mime_content_type($filePath));header("Content-Length: " . $fileSize);readfile($filePath);

2. 代码说明

  1. filemtime($filePath):

    • 获取文件的最后修改时间,用于设置Last-Modified头。

  2. filesize($filePath):

    • 获取文件大小,用于生成ETag。

  3. ETag生成:

    • 使用文件大小和最后修改时间生成一个唯一的ETag值(这里用md5哈希)。

  4. Last-Modified头:

    • 使用gmdate将最后修改时间格式化为HTTP日期格式。

  5. If-None-Match和If-Modified-Since检查:

    • 如果客户端发送了If-None-Match或If-Modified-Since头,并且与当前资源的ETag或Last-Modified匹配,则返回304 Not Modified,告诉浏览器使用缓存。

  6. 返回资源内容:

    • 如果资源有更新,则返回完整的资源内容。


3. 示例流程

  • 第一次请求:

    • 服务器返回资源内容,并附带Last-Modified和ETag头。

    • 浏览器缓存资源。

  • 后续请求:

    • 浏览器发送If-None-Match(值为ETag)和If-Modified-Since(值为Last-Modified)头。

    • 如果资源未修改,服务器返回304 Not Modified,浏览器使用缓存。

    • 如果资源已修改,服务器返回新的资源内容。


4. 注意事项

  1. 动态内容:

    • 对于动态生成的内容(如数据库查询结果),需要手动生成ETag和Last-Modified值。

  2. 性能优化:

    • 对于静态资源,建议使用Web服务器(如Nginx或Apache)的缓存机制,而不是PHP。

  3. 时间同步:

    • 确保服务器时间准确,否则Last-Modified可能会出错。

  4. ETag生成算法:

    • ETag的生成算法可以根据需求调整,确保唯一性和性能。


5. 在Apache或Nginx中启用ETag和Last-Modified

如果资源是静态文件,可以直接在Web服务器中启用ETag和Last-Modified,而不需要通过PHP处理。

Apache配置

apache
复制
<FilesMatch "\.(html|css|js|jpg|png)$">
    FileETag MTime Size
</FilesMatch>

Nginx配置

nginx
复制
location ~* \.(html|css|js|jpg|png)$ {
    etag on;}

通过以上方法,可以在PHP网站中有效启用ETag和Last-Modified机制,减少重复加载资源,提升网站性能。


最新文章 PHP+MySQL 查询与时间戳相差不超过15秒的记录 从代码到部署:GPT如何提升全栈网站的运行效率? GPT + Webpack:智能打包优化,减少资源加载时间 让API响应更快!GPT辅助优化后端接口逻辑 GPT如何帮助识别并修复网站性能瓶颈? 用GPT自动压缩与混淆代码,提升网站运行效率 AI优化CSS:GPT如何减少渲染阻塞,提升页面加载速度? GPT生成的算法 vs 手写算法:谁更高效? 告别低效循环:GPT如何帮你重构高性能前端代码? 让网站更快!用GPT自动优化SQL查询与数据库设计 GPT如何优化JavaScript代码?实测性能提升30%+ 网站开发新范式:用GPT实现“需求→代码”一键生成 GPT + IDE插件:打造你的智能编程加速器 AI结对编程:GPT如何帮助程序员减少调试时间? 从构思到上线:GPT 如何加速个人开发者的小型网站项目? GPT辅助编程:如何减少网站开发中的认知负荷? 程序员必看!用GPT快速生成高质量网站模板 实测:使用GPT生成代码 vs 手动编码,效率差距有多大? GPT如何优化程序员的工作流?从需求分析到代码部署 告别加班!用GPT自动化80%的重复性网站开发任务 10 个 GPT 高效编码技巧,让网站开发速度提升 3 倍 未来已来:GPT将如何重塑网站开发行业? AI如何改变团队协作?GPT在多人开发网站中的角色 GPT+JavaScript:快速生成动态网页交互逻辑 告别熬夜改Bug!GPT如何提升网站调试效率? GPT在网站安全中的应用:自动检测漏洞与修复建议 AI写CSS?GPT如何帮助开发者快速美化网页 ChatGPT vs. GitHub Copilot:哪个更适合网站开发? GPT助力数据库设计:智能生成SQL与ORM代码 用GPT优化SEO:AI在网站内容与结构中的应用 前端开发者的福音:GPT如何自动生成响应式网页? 让GPT帮你写API!后端开发效率提升200% GPT+低代码:未来网站开发的趋势与机遇 AI辅助编程:如何利用GPT快速调试网站错误? GPT生成的代码靠谱吗?实测其在网站开发中的表现 程序员的新搭档:用GPT优化前端与后端代码 从零到上线:GPT如何加速全栈网站开发? 10 个 GPT 在 Web 开发中的实际应用,让编码更轻松 GPT vs. 传统编程:AI如何改变网站开发流程? 告别重复代码!GPT在网站开发中的自动化实践
在线客服
联系方式

电话

13790710509

上班时间

周一到周五

二维码
线