Etag缓存在PHP和NodeJS中的实现

简介:

HTTP 提供了许多页面缓存的方案,其中属 Etag 和 Last-Modified 应用最广。本文会先介绍 Etag 的应用场景,然后说说他在 php 和 node 中的使用。

本文地址:http://www.cnblogs.com/hustskyking/p/etag-in-node.html,转载请注明源地址。

一、Etag的使用

客户端和浏览器之间的交互:

+---------+       1         +---------+
|         |---------------->|         |
|         |   2200,OK)   |         |
|         |<----------------|         |
|    客   |    3(Etag)     |    服   |
|         |---------------->|         |
|    户   |    4304)      |    务   |
|         |<----------------|         |
|    端   |    3(强制刷新)  |    端   |
|         |---------------->|         |
|         |   6200,OK)   |         |
|         |<----------------|         |
+---------+                 +---------+
                <Created By Barret Lee>

1. 客户端向服务器请求资源S

2. 服务器返回数据,并带上一个 Etag

3. 客户端再次请求资源S,由于上次服务器给他返回了一个 Etag,这次请求的时候他会带上这个 Etag

4. 服务器发现请求中包含 Etag,判断是否过期,没过期则返回 304 Not Modified

5. 客户端强制刷新(如chrome中ctrl+shift+R刷新页面),请求中剔除 Etag

6. 服务器未发现请求中包含 Etag,返回资源S,并带上一个 Etag

二、代码实现

第一次请求数据:

浏览器在接受到服务器发过来的 Etag 后,会保存下来,下次请求的时候会将它放在请求头中,其 key 值为 If-None-Match。

服务器拿到 If-None-Match 之后,对比之前的 Etag,如果没变,则返回 304 Not Modified.

1. php 中的 Etag

<?php
    $str = "Barret Lee";
    $Etag = md5($str);

    if(array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) and $_SERVER['HTTP_IF_NONE_MATCH'] == $Etag){
        header("HTTP/1.1 304 Not Modified");
        exit();
    } else {
        header("Etag:" . $Etag);
        echo $str;
    }
?>

Etag 是一个字符串,我们一般使用该请求对应响应输出的 md5 值作为 Etag,可以简单地理解为文件的版本号。在 php 中存在两个获取 md5 的函数,一个是针对字符串的,就是md5(),然后就是针对文件的, md5_file()

首先判断在请求中是否包含 'HTTP_IF_NONE_MATCH' 这个 key,如果包含并且其值为之前的 md5 值,则返回 304,否则输出 Etag 以及内容。

2. node 中的 Etag

与 php 有些不同,从 $_SERVER 中拿到的内容是经过 apache 包装过的,而 node 获取的数据是最原始的。

var hashStr = "A hash string.";
var hash = require("crypto").createHash('sha1').update(hashStr).digest('base64');

require("http").createServer(function(req, res){
    if(req.headers['if-none-match'] == hash){
        res.writeHead(304);
        res.end();
        return;
    }
    res.writeHead(200, {
        "Etag": hash
    })
    res.write(hashStr);
    res.end();
}).listen(9999);

上面对 hashStr(输出的内容) 进行了简单的处理,并将其作为 Etag 放在 head 中输出,上面的代码一目了然,我就不解释了。

三、小结

Etag 在缓存处理中用的比较广泛,使用它可以减少一些不必要请求的带宽的占用。服务器输出的内容不变,浏览器就应该使用缓存,没必要每次都向服务器端索要数据,造成不必要的浪费。

从上面我们可以看到,如果想拿到 Etag,就必须先拿到要输出的数据,所以 Etag 只能减少带宽的占用,并不能降低服务器的消耗。如果是静态页面,可以判断文件最近一次的修改时间(Last-Modified),获取文件上次修改时间的消耗比拿到整个数据的消耗要小的多。所以很多时候 Etag 都是配合这 Last-Modified 一起使用的。

上面的 php 和 node 代码演示,很明显的差异就是,node 更加细致,或者说他更加底层,我们可以获取的几乎都是未加修饰的原始数据,从数据量的交互和可操控性来看,我更偏向于 node 的使用。




本文转自Barret Lee博客园博客,原文链接:http://www.cnblogs.com/hustskyking/p/etag-in-node.html,如需转载请自行联系原作者

目录
相关文章
|
18天前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
|
4月前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存对性能的影响
【4月更文挑战第25天】 在提升PHP应用性能的众多策略中,Opcode缓存技术因其显著的效果和较低的复杂度而备受开发者青睐。本文将深入探讨Opcode缓存机制,解析其对PHP执行效率的提升原理,并通过实验数据展示启用Opcode缓存前后的性能差异。我们还将讨论几种流行的Opcode缓存工具,如APC、OpCache与APCu,并评估它们的优劣及适用场景,帮助开发者根据不同的项目需求做出合适的选择。通过本文,读者不仅能够了解Opcode缓存的工作原理,还能学会如何在实际项目中应用这一技术以优化PHP应用程序的性能。
|
4月前
|
存储 缓存 自然语言处理
深入PHP内核:理解Opcode缓存与性能优化
【5月更文挑战第14天】 在动态语言的世界里,PHP一直因其高性能的执行效率和广泛的社区支持而备受青睐。随着Web应用的复杂性增加,对性能的要求也越来越高。本文将探讨PHP的Opcode缓存机制,解析其对性能提升的贡献,并展示如何通过配置和使用不同的Opcode缓存方案来进一步优化PHP应用的性能。我们将深入到PHP的核心,了解Opcode是如何生成的,以及它如何影响最终的执行效率。
|
1月前
|
存储 缓存 自然语言处理
|
16天前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
4月前
|
存储 缓存 PHP
深入PHP内核:理解Zend Engine与Opcode缓存
【5月更文挑战第30天】 在PHP的开发世界中,性能优化是一个永恒的话题。随着现代Web应用的复杂性日益增加,仅仅依靠代码层面的优化已经远远不够。本文将深入探讨PHP的执行心脏——Zend Engine,以及如何通过Opcode缓存机制提升PHP应用的执行效率。我们将透过对Zend Engine工作原理的分析,了解Opcode缓存的实现原理,并通过实例来展示其对性能提升的显著影响。
|
4月前
|
存储 缓存 自然语言处理
深入PHP内核:Opcode缓存与性能优化
【5月更文挑战第31天】 在提升PHP应用性能的众多策略中,Opcode缓存技术以其显著的性能提升效果而广受关注。本文旨在深入探讨PHP的Opcode缓存机制,解析其对性能提升的影响,并讨论如何通过配置和优化实践来充分利用Opcode缓存。文章将首先介绍Opcode的概念及其在PHP执行过程中的作用,然后分析几种流行的Opcode缓存解决方案,最后提供针对性的优化建议,帮助开发者实现高效的PHP应用。
|
4月前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存机制
【5月更文挑战第1天】 在动态语言如PHP的执行过程中,每次脚本被请求时都需要经过一系列复杂的解析和编译步骤。为了优化这一过程并提高性能,PHP引入了Opcode缓存机制。本文将详细探讨Opcode的概念、作用以及它如何显著提升PHP应用的执行效率。我们将从缓存原理出发,分析几种常见的Opcode缓存工具,并通过实例说明如何在实际项目中实现和优化缓存策略。
|
4月前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存对性能的影响
【4月更文挑战第30天】 在动态内容生成的Web开发领域,PHP一直是广受欢迎的脚本语言之一。然而,由于其每次请求都需要经过解释执行的特性,性能上往往受到质疑。随着现代PHP引擎如Zend和Facebook的HipHop Virtual Bytecode (HPHPc)的出现,引入了Opcode(操作码)缓存机制来提升PHP的性能。本文将深入探讨Opcode缓存技术是如何工作的,以及它对PHP应用程序性能的具体影响。我们将通过实验数据与分析,揭示Opcode缓存在不同场景下的优势和局限性,并提出优化策略。
|
4月前
|
缓存 NoSQL PHP
【PHP 开发专栏】Redis 作为 PHP 缓存的解决方案
【4月更文挑战第30天】本文探讨了Redis作为PHP缓存的优势,如高性能、丰富数据结构、数据持久化和分布式支持。通过安装配置Redis、选择PHP客户端、执行读写操作及制定缓存策略实现缓存。应用场景包括页面、数据和会话缓存。但需注意数据一致性、过期时间、容量和安全问题,以确保应用稳定和安全。Redis能有效提升PHP应用响应速度和处理能力。
117 2