Http 1.1 Etag 与 Last-Modified提高php效率


Posted in PHP onJanuary 10, 2008

在 Blog 盛行的今天,一些 Web 应用需要解析大量的 RSS Feed .如何提高效率是个非常重要的问题.在 MagpieRSS 的 Features 中列举了这样的一条: HTTP Conditional GETs Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 这里的 Etag 引起了我的注意.

什么是 Etag ?

通过阅读 RFC 2616 ,得到了对 Etag 的一点印象:

The ETag response-header field provides the current value of the entity tag for the requested variant......Entity tags are normally "strong validators," but the protocol provides a mechanism to tag an entity tag as "weak." One can think of a strong validator as one that changes whenever the bits of an entity changes, while a weak value changes whenever the meaning of an entity changes. Alternatively, one can think of a strong validator as part of an identifier for a specific entity, while a weak validator is part of an identifier for a set of semantically equivalent entities.

从上我们可以大致得知,Entity tags 本质上说是一种"强校验器",但是 HTTP 协议提供了一种通过给 Entity tags 打标签的"弱"的机制(类似于内容的校验码).虽然这段话后面通过两种方式进行了解释,但是还是有些晦涩.我看了这段话之后只是得出了 Etag 的 "E" 代表 "Entity" 而已.

Magpie 首页上提到了一篇文章: HTTP Conditional Get for RSS Hackers ,拜读之后清晰了许多.要先说说 HTTP Conditional GETs 的基本原理,很简单,就是说,从 Web 服务器取数据的时候,如果文件变化了,给我新的文件,如果文件没有变化,只需告诉客户端没有变化即可,不必再把文件取回来.这样就可节省大量的网络带宽和资源.

Etag 与 Last-Modified 是从 HTTP 1.0 到 HTTP 1.1 才有的概念.当我们从 Web 服务器获取文件的时候,只需要读取 HTTP 响应头的 Etag 与 Last-Modified 字段即可,这两个字段里面的具体内容是什么可以不管(可能会千奇百怪,RFC 2616 对 Etag 没有具体值的定义),把这两个值 Cache 在本地,下次检查文件是否更新的时候比对这两个值即可.如果没有变化,服务器的响应代码不是 HTTP 200 (OK) , 而是 304.

Http 1.1 Etag 与 Last-Modified提高php效率

如上图.目前 OpenRSS 虽然订阅了40 多个 Feed,但是响应速度很不错.在使用 Gregarius 的过程中(Lilina 也应用了 ETag),发现了 FeedBurnrer 烧录的 Feed ,几乎都是用了 Etag 的(否则估计服务器要瘫痪,Hoho).我们再测试一下 HTTP header 的响应情况:

$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:15 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8

$ curl -I http://feeds.feedburner.com/dbanotes
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2005 11:34:21 GMT
Server: Apache
Last-Modified: Tue, 25 Oct 2005 04:30:12 GMT 
ETag: U4q478bDKLqZ8UMMC8A5afZuHug
Content-Type: text/xml;charset=utf-8

在这个期间,我的 Blog 没有更新.所以 Last-Modified 和 ETag 返回的都是相同的值.这样 Gregarius 就不必重新解析了. 国内的 GreatNews 是支持 HTTP Conditional GETs 的,更棒的是还支持 gzip/deflate encoding.而另一个 RSS 阅读工具 POPU (周博通) 就不知道了.

以上是我的笔记,如有理解错误,请指正!

PHP 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 PHP
php反射应用示例
Feb 25 PHP
php实现面包屑导航例子分享
Dec 19 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
Jan 08 PHP
php连接oracle数据库的核心步骤
May 26 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP封装的完整分页类示例
Aug 21 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
PHP读取目录下所有文件的代码
Jan 07 #PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 #PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 #PHP
php下过滤HTML代码的函数
Dec 10 #PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 #PHP
php获得当前的脚本网址
Dec 10 #PHP
php代码把全角数字转为半角数字
Dec 10 #PHP
You might like
PHP写杨辉三角实例代码
2011/07/17 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python多线程扫描端口示例
2014/01/16 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
python对视频画框标记后保存的方法
2018/12/07 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
html5 canvas 使用示例
2010/10/22 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
写出二分查找算法的两种实现
2013/05/13 面试题
管理失职检讨书
2014/02/12 职场文书
公司应聘自荐书
2014/06/14 职场文书
售房协议书
2014/08/19 职场文书
学雷锋的心得体会
2014/09/04 职场文书
运动员代表致辞
2015/07/29 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
物业管理交接协议书
2016/03/24 职场文书
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android