微信号:grzlwx

介绍:光荣之路官方资讯

Web缓存大作战:编写支持缓存的脚本(SoSo Hot)

2015-07-13 22:27 光荣之路


  1. 什么是Web缓存,为什么要使用它?

  2. 缓存的类型:

    1. 浏览器缓存;

    2. 代理服务器缓存;

    3. 网关缓存;

  3. Web缓存无害吗?为什么要鼓励缓存?

  4. Web缓存如何工作

  5. 如何控制缓存和不缓存:

    1. HTML Meta标签 vs. HTTP头信息;

    2. Pragma HTTP头信息(以及为什么不起作用);

    3. 使用Expires HTTP头信息控制不过期;

    4. Cache-Control(缓存控制)HTTP头信息;

    5. 验证器和验证;

  6. 创建支持缓存网站的小技巧;

  7. 编写支持缓存的脚本;

  8. 常见问题解答;

  9. 实现需注意的:Web服务器端;

  10. 实现需注意的:服务端脚本;

  11. 参考文档和拓展阅读;

  12. 关于本文档;

创建支持缓存网站的小技巧

除了使用新鲜度信息以及验证,还有其他一些技巧可以让你网站的缓存更加友好:

  • 保持URL稳定:这是缓存的金科玉律,如果你为不同页面,不同用户或不同网站提供相同的内容,他们应该使用相同的URL. 这是简单却非常行之有效的方法。例如,你的HTML中的某个引用地址是"/index.html", 则要一直使用这个地址。

  • 不同地方的图片和其他元素使用同一库

  • 对于不经常改变的图片/页面启用缓存,通过将Cache-Control: max-age头信息的值设大一点。

  • 对于定期更新的内容通过指定max-age或过期时间实现缓存。

  • 如果资源改变了(尤其下载文件),改变其名字。由于一般这种资源会有很长的过期时间,而服务器上一直是正确的版本;因此,链接这个下载资源的页面需要要比较短的过期时间(//zxx: 我司页面5分钟过期)。否则,会出现服务器的资源是新的,但页面被缓存了,其中的链接地址还是旧的,就会出现新旧版本冲突的可能Add

  • 万不得已不要变动文件:否则你要设置一个新的Last-Modified值。另外,当你更新站点的时候,只要上传改动的那些文件,而不要把整个站点都覆盖过去。

  • Cookie能不用就不用:Cookie难以被缓存,且大多情境下是没有必要的。如果你非得使用Cookie,建议用在动态页面上。

  • 减少SSL的使用:因为共享缓存不能存储认证页面,只在必要的时候使用,并且在SSL页面上减少图片的使用。

  • 使用REDbot检查你的网站:可以帮助你应用本文所介绍的一些概念。

⑧ SSL:全称Secure Socket Layer – 安全套接层,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之 传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。

⑨ REDbot:REDbot = RED + robot,是个机器人,检查HTTP资源,看他们如何会表现,指出常见的问题,并提出改进建议。虽然它属于HTTP一致性测试仪,但却可以找到不少HTTP相关问题。

编写支持缓存的脚本

默认情况下,大多数的脚本不会返回验证器(Last-ModifiedEtag响应头)或新鲜度信息(ExpiresCache-Control)。尽管有些脚本的确是动态的(意味着每次请求都有不同的响应),还是有很多(如搜索引擎或数据库驱动的)网站可以从缓存中受益。

一般来讲,对于同一个请求(无论是几分钟还是几天之后),如果脚本产生的内容是可重复的,则可以缓存。脚本内容的改变仅仅依赖于URL,则可以缓存。如果是依赖于Cookie,认证信息或其他外部条件,很可能不缓存。

  • 最利于缓存的脚本就是在内容改变时导出成静态文件,服务器会想对待其他Web一样对待它的,生成以及使用验证器,于是你可以好好地喝杯咖啡了。记住,只有文件更改的时候才写入,这样Last-Modified时间就会被保存下来。

  • 另外的脚本缓存之道就是使用age相关的头部,相比Expires, Cache-Control: max-age更容易些,因为是相对时间,每次新请求完成后重新设置,时间到了,再重新请求,再设置新的相对过期时间。

  • 如果上面的做法你搞不定,你还可以试试通过脚本生成一个校验器, 然后回应If-Modified-Since和/或If-None-Match请求。通过分析HTTP头信息,在适合的时候回应304 Not Modified. 不幸的是,这不是个打打酱油就能搞定的任务。

其他一些技巧

  • 不要使用POST:若是获取数据,尽量不使用POST模式,因为POST方式返回内容大部分不会被缓存,相对的,通过GET以路径和查询发送的信息被缓存存储下来供后续使用。

  • URL地址中不要嵌入特定的用户信息,除非生成的内容对于用户而言是唯一的。

  • 不要指望同一用户的所有请求来自同一主机,因为缓存经常协同工作。//zxx: 嘛意思?

  • 生成Content-Length头信息。实现不难,可让你的脚本以持久连接(persistent connection)形式响应。这允许客户端在一个TCP/IP请求上请求多个内容,而不是为每次请求单独建立连接,这样你的网站相应会快很多。

详见实现注意事项。

⑩Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

(未完待续)

(原文来源:http://www.mnot.net/cache_docs/

译者:张鑫旭 译文来源:http://www.zhangxinxu.com/wordpress/?p=3338


一字一句当思来之不易,感谢作者,传播测试知识、技能与正能量!

光荣之路软件测试培训

官网:http://www.gloryroad.cn/

微信公众号:gloryroadtrain

性能测试QQ群:415987441
软件测试招聘QQ群: 203715128
自动化3群QQ: 371211499




 
光荣之路 更多文章 今天晚上的 linux 公开课- Awk 编程 7月28日(今天)晚上的 linux 公开课- shell编程 8月4日(今天)晚上的 linux 公开课- shell编程 9月1日(本周一)晚8点半,光荣之路Web自动化系列基础课—javascript第二讲 推荐本好书《与机器赛跑》
猜您喜欢 以用户为中心的设计细节(1) java 启动线程的两种方式 Web重构之道 初窥 iOS 9 的 Contacts 框架 【数据科学】R语言ggplot2包数据可视化