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

在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. 示例流程


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机制,减少重复加载资源,提升网站性能。


上一篇:网站排名提升的7个关键因素:DeepSeek专家解析
下一篇:启用 Lazy Loading(懒加载),仅在用户滚动到图片区域时加载,代码实例