Chinaunix首页 | 论坛 | 博客
  • 博客访问: 962653
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: PHP

2013-03-26 17:42:19

转自:http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html
在用户浏览blog的不同页面时,很多内容是重复的,比如相同的javascript,css,背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件,将大大降低页面产生的流量,从而降低页面载入时间。

根据服务器端的响应header(怎么看HTTP Header),一个文件对浏览器而言,有几级不同的缓存状态。

  1. 服务器端告诉浏览器不要缓存此文件,每次都到服务器上更新文件。
  2. 服务器端没有给浏览器任何指示(此时我也不知道这时候浏览器将会怎么做),这种情况多为动态脚本(比如PHP)产生的文件。
  3. 在上次传输中,服务器给浏览器发送了Last-Modified或Etag数据,再次浏览时浏览器将提交这些数据到服务器,验证本地版本是否最新的,如果为最新的则服务器返回304代码,告诉浏览器直接使用本地版本,否则下载新版本。一般来说,有且只有静态文件,服务器端才会给出这些数据。
  4. 服务器强制要求浏览器缓存文件,并设置了过期时间。在缓存未到期之前,浏览器将直接使用本地缓存文件,不会与服务器端产生任何通信。

我们要做的是尽量强制浏览器到第四种状态,特别是对于javascript, css和图片等变动较少的文件。

对于PHP产生的动态内容,只需要在内容输出之前输出强制缓存的header即可,比如下面的代码即要求浏览器缓存文件1个月:

php ("Cache-Control: public"); ("Pragma: cache");

  $offset = 30*60*60*24; // cache 1 month $ExpStr = "Expires: ".("D, d M Y H:i:s", () + $offset)." GMT"; ($ExpStr); ?>

对于静态文件,一般的服务器都支持第3级缓存状态。要想达到第四级的缓存效果,要么像之前GZIP压缩那样,用PHP外包一层,然后用PHP处理。要么需要服务器端的支持,APACHE的一个模块mod_expires支持给文件添加expires header。把下面的代码加入你的blog目录下的.htaccess文件,如果你的服务器安装了mod_expires模块,则将自动生效,图片等强制缓存一个月,html文档缓存10分钟。如果该模块没有安装,也不会出错。

<IfModule mod_expires.c> ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/html A600 IfModule>

在有mod_expires更详细的文档和教程。不过我要说明的是,mod_expires在绝大多数服务器上都没安装 :( ,因为虽然这个模块包含在Apache的发行版里,但并不是默认安装模块。

阅读(519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~