软件测试两年经验,感觉这两年成长还是不错的,主攻性能测试,望有相关 共同理想的朋友一起探讨交流职业路~

提高网站访问速度的34条准则(11-15)

上一篇 / 下一篇  2011-03-28 23:04:30

11避免重定向(Avoid Redirects)

tag:content

重定结束于301302状态码。这里有一个301响应的HTTP头的例子:
      HTTP/1.1 301 Moved Permanently
      Location: http://example.com/newuri
      Content-Type: text/html

浏览器会自动把用户转向Location域中指明的Url地址。HTTP头里包含了重定向所需的所有信息。响应的主体一般是空的。301或者302响应都不会被实际缓存,除非添加额外的头部,比如Expires或者Cache-Control指明了它应该被缓存。meta. refresh标签和JavaScript也可以将用户重定向到不同的URL,但如果你必须执行重定向,最好的方法是使用标准的3XX HTTP状态代码,以便使后退按钮工作正常。

需要谨记的是,重定向降低了用户体验。在用户和HTML文档之间插入的重定向延误了页面的呈现和组件下载,因为它们都不可能在获得HTML文档之前开始。

一种最浪费性能的重定向频繁发生而网络开发者们却往往没有意识到,那就是当地址中应当有一个左斜线(/)却没有的时候。比如,访问http://astrology.yahoo.com/astrology会导致一个301效应并重定向到http://astrology.yahoo.com/astrology/(注意这里加了一个左斜线)。在Apache中,这可以使用mod_rewrite,或者在Apache事件处理中使用DirectorySlash指令来修补。

使用重定向的另一个常见场景是连接旧网站和新网站。还包括连接网站的不同部分,或者在不同情况下(比如依据浏览器的类型,用户的类型等)重定向用户。使用重定向来连接两个网站很简单而且需要很少的额外代码。虽然在这些情况下使用重定向减少了开发者的麻烦,但却降低了用户体验。如果两部分在同一个服务器上,可以使用Aliasrewrite来替代重定向。如果域名变更引起了重定向,可以创建一个CNAME(一种可以创建一个别名使一个域名指向另一个的DNS记录)结合Alias或者mod_rewrite来替代重定向。

 

12移除重复的脚本(Remove Duplicate Scripts)

tag:javascript

在同一个页面中包含两个相同的脚本文件降低了性能。这并不如你想象的那么罕见。在对美国十大网站中的检查中,发现它们中的两个包含了重复的脚本。有两个主要因素增加了一个页面包含两个相同脚本的几率——团队的大小和脚本的数量。当脚本被重复包含时,由于增加了不必要的HTTP请求和JavaScript的执行,影响了性能。

不必要的HTTP请求在IE中存在,而Firefox终没有。IE中,如果一个外部脚本被包含了两次而且没有被缓存,在页面加载的过程中会产生两次HTTP请求。即使脚本被缓存了,当用户重载页面时,多余的HTTP请求也会发生。

产生多余的HTTP请求的同时,多次执行脚本也会浪费时间。FirefoxIE中,无论是否被缓存,脚本都会被重复执行

避免脚本被意外加载两次的一个方法是在你的模板系统中执行一个脚本管理模块。通常的方式是在HTML页面中使用SCRIPT标签来添加一个脚本:
<script. type="text/javascript" src="menu_1.0.17.js"></script>

HP中,可以选择创建一个叫做insertScript的方法:
<?php insertScript("menu.js") ?>

这个函数不仅仅能防止脚本被重复加载多次,还可以解决脚本的其他问题,比如独立性检测以及为脚本添加版本号码以应对far future Expires头部。

 

13设定ETags (Configure ETags)

tag:server

实体标签(ETags)是服务器和浏览器用于确定浏览器中缓存的组件和服务器中的是否对应的一种机制。("entity"是组件的另一种说法:图片、脚本、样式表等等)添加ETags用于辨别组件提供了比单纯利用最后修改时间更为灵活的机制。ETag是一个唯一标识组件的特定版本的字符串。它的唯一格式规范是字符串必须被引号引用。来源服务器使用ETag响应头来设定一个组件的ETag
      HTTP/1.1 200 OK
      Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
      ETag: "10c24bc-4ab-457e1c1f"
      Content-Length: 12195

当浏览器晚些时候需要检测一个组件时,它使用If-None-Match头部把ETag传回来源服务器。如果ETag匹配了,会返回一个304状态码,在这个例子里它会减少12195个字节的响应:
      GET /i/yahoo.gif HTTP/1.1
      Host: us.yimg.com
      If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
      If-None-Match: "10c24bc-4ab-457e1c1f"
      HTTP/1.1 304 Not Modified

ETag的问题是它们往往在网站的一个服务器中被设为唯一的,当浏览器从一个服务器得到了组件并在稍后试图到另一个服务器验证时,ETag会不匹配,而这在使用多个服务器来处理请求的网站中是很常见的。默认情况下,ApacheIISETag中嵌入的数据戏剧性的减少了应用多台服务器的网站的ETag验证成功几率。

Apache1.32.新版本的ETag格式是inode-size-timestamp。虽然一个给定的文件在多台服务器中处于同一个目录,而且有同样的大小,权限,时间戳,但它的inode在不同服务器中是不同的。

IIS5.06.0有同样的问题。IISETag的格式是Filetimestamp:ChangeNumberChangeNumber用来跟踪IIS配置的改变次数。一个网站的所有IIS不可能有相同的ChangeNumber

这导致的结果是,ApacheIIS对完全相同的组件产生的ETag在不同服务器间不能匹配。如果ETags不匹配,用户不会得到小而快的304响应,而是一个普通的200响应和组件的所有数据。如果你把你的网站放在了一个服务器里,这不会是一个问题。但如果你的网站有多台服务器,而且你使用了ApacheIIS默认的ETag配置,你的用户会访问页面的速度会变慢,你的服务器加载的程度更高,消耗了更大的带宽,代理服务器不能有效的缓存你的内容。即使你的组件有一个ar futureExpires头部,当用户重载或者刷新页面时,依然会发送一个GET请求。

如果你不打算利用ETags提供的灵活的验证模式,你最好把ETag统统移除Last-Modified头部的验证方式给予组件的时间戳。移除ETag同时减少响应和随后的请求中的HTTP头部大小。这篇微软的支持文档描述了怎样在IIS中移除ETags。在Apache中,你只要在Apache配置文件中添加如下一行:
     FileETag none

14Ajax可以缓存(Make Ajax Cacheable)

tag:content

Ajax的好处之一是它能给用户提供瞬间的响应,因为它从服务端异步请求数据。但Ajax不能保证用户在等候那些异步的JavaScriptXML响应返回时什么都不做。在应用程序中,用户是否继续等待取决于Ajax怎样应用。比如,在一个基于WebEmail客户端用户会等候Ajax返回他们所搜索的邮件信息。记住异步并不代表即刻

为了提高性能,优化Ajax响应很重要。提高Ajax性能最重要的方式是使响应缓存,正如添加一个过期期限和缓存控制头这一节讨论的。这些原则同样适用于Ajax

·                                        Gzip组件

·                                        减少DNS查询

·                                        压缩JavaScript.

·                                        避免重定向

·                                        设定ETag

我们看一个例子。一个Web20的邮件客户端可能会用Ajax自动下载用户地址簿。如果用户从上次使用邮件网站以来没有修改她的地址簿,那么如果Ajax响应使用了长期失效时间或者缓存控制头部,地址簿就可以从缓存中读取出来。浏览器必须被告知使用之前的缓存地址簿而不是请求一个新的地址簿。可以在地址簿Ajax

TAG:

 

评分:0

我来说两句

日历

« 2024-04-24  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 441218
  • 日志数: 75
  • 图片数: 1
  • 建立时间: 2009-01-08
  • 更新时间: 2012-10-04

RSS订阅

Open Toolbar