Archive for September, 2009

PHP处理Etag、lastModified和Expires

Saturday, September 5th, 2009

之前看到robbin基于资源的HTTP Cache的实现介绍,想到这是一个很有意思的功能,原理很简单,但很多人都会忽略,于是乎打算集成到ColaPHP框架中来,让浏览器缓存动态内容,对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容,还是很有意义的。 如果在服务器端设置了Etag、lastModified和Expires之后,下次再访问同一资源的时候,一个典型的HTTP头是这样的: Host            127.0.0.1 User-Agent        Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7 Accept            text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language        zh-cn,zh;q=0.5 Accept-Encoding        gzip,deflate Accept-Charset        GB2312,utf-8;q=0.7,*;q=0.7 Keep-Alive        300 Connection        keep-alive If-Modified-Since    Sat, 05 Sep 2009 12:44:56 GMT If-None-Match        foobar Cache-Control        max-age=0 关于lastModified、Etag和Expires的工作原理,可以参看http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/,简单来说: lastModified:设定一个最后修改时间,浏览器下次访问的时候,发送一个"If-Modified-Sinc"的头信息,如果内容在这个时间之后没有更新,服务器直接返回一个304 Not Modified而不传输详细内容,可以节省带宽。 Etag:设定一个标记,浏览器下次访问时,发送一个"If-None-Match"的头信息,如果服务器内容还是这个标记没变,也直接返回一个304 Not Modified而不传输详细内容,同样可以节省带宽。 Expires:设定一个过期时间,如果当前请求在这个过期时间之类,则不发送HTTP请求,不仅可以节约服务器带宽,还可以减少服务器HTTP请求数。 主要通过header函数来发送,比较简单,直接上代码: public static function etag($etag, $notModifiedExit = true) { ...