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 相关文章推荐
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php多文件上传实现代码
Feb 20 PHP
跟我学Laravel之快速入门
Oct 15 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
php模拟post提交数据的方法
Feb 12 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
php强制下载文件函数
Aug 24 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php微信公众号开发之二级菜单
Oct 20 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 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
第九节 绑定 [9]
2006/10/09 PHP
PHP实现视频文件上传完整实例
2014/08/28 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
js获取变量
2006/08/24 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
Python解析nginx日志文件
2015/05/11 Python
python先序遍历二叉树问题
2017/11/10 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
大学生自我鉴定评语
2014/01/27 职场文书
军人违纪检讨书
2014/02/04 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
第二课堂活动总结
2014/05/07 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
三峡大坝导游词
2015/01/31 职场文书
办公室禁烟通知
2015/04/23 职场文书
房贷工资证明范本
2015/06/12 职场文书
禁毒主题班会教案
2015/08/14 职场文书