再发请求获取这些资源文件(一)_光明网(组图)

优采云 发布时间: 2021-08-03 06:11

  再发请求获取这些资源文件(一)_光明网(组图)

  包括css、js、图片等,然后发送请求获取这些资源文件。在 HTTP 1.1 请求中,

  多个请求可以重叠,但是页面文件必须先到达才能知道要请求哪些资源文件。

  所以整个过程有几个阶段,第一个阶段是第一个字节的获取时间,

  即从URL请求到服务器收到HTTP请求并返回响应内容的时间,

  这不仅仅是 DNS 和建立连接的时间。对于动态页面,

  只有当服务器执行动态代码并返回页面代码时,

  所以包括操作和数据库操作会直接增加首字节获取时间。

  对于静态文件,第一个字节的获取时间通常更快。

  但是如果与服务器的网络不畅,比如服务器在国外,就会造成长时间的延迟。

  在阿里云的云监控中,可以任意设置HTTP监控点来监控服务器的响应时间。

  比如我在同一台服务器上设置了两个网站:

  

  这里可以清楚的看到,对于需要调用数据库的Wordpress,

  响应时间显然比下面简单的 HTML 内容要长很多。

  至于响应时间,基本上响应时间是即时的。在这里可以看到服务器物理距离的影响。

  因为服务器在杭州,从杭州访问只需3ms,从青岛访问需要4ms。

  至于数据到服务器再返回的响应时间,可以得到ping命令。

  说到ping命令很多人都用过,但是好像很多人只是用它来看看服务器是不是打不通。 . .

  先说一下ping的原理:向目的地发送ICMP回显请求消息,并报告是否收到了想要的ICMP回显响应。

  理论上,ping发送的数据大小应该和对方一样大小,这样就可以很容易的看到与服务器的通信状态了。

  所以如果ping的响应时间一直稳定,突然有波动,可能是突然满带宽造成的,

  这时候有了对服务器资源的监控,就可以很容易的看出问题出在哪里了。 (貌似我的带宽没有问题...囧~)

  

  在ping的同时不断刷新页面,可以看到某一时刻的时间明显变长了,也就是此时的带宽已经被占用了。

  第二阶段是获取页面文件的时间。在获取页面文件之前,不会请求任何资源文件。

  因为不知道页面上有什么资源文件,这个时间也很关键。

  第三阶段是获取head中各个资源文件的时间。资源文件按照它们在 HTML 页面中出现的顺序加载。

  所以head里的资源会先加载,head主要是css和js文件,然后页面渲染,

  所以要特别注意头部所需资源的加载时间。毕竟在页面渲染之前,用户看到的都是空白。

  第四阶段是获取剩余资源文件的时间。这部分主要是图片、*敏*感*词*、视频等文件。

  重要性没有那么高。毕竟页面已经出来了。大多数用户认为在几秒钟内看到它们加载是可以接受的。

  其实页面渲染时间还是有的,但是因为它和加载同步,通常不会比加载慢,所以可以忽略。

  测试工具

  如果想直观的获取这些数据,可以直接看页面的时间线,也就是瀑布图,

  现在各大浏览器的内置调试工具都可以实现这个功能。以这个网站和safari为例,

  可以看到如下图:第一次访问(在safari中可以使用shift刷新按钮忽略缓存):

  

  再次访问:

  

  从图中可以清楚的看出,一共引用了37个资源文件,共979.9KB的数据。第一次访问总时间3.25s,第二次访问总时间2.02s。

  说说第一次访问:第一行蓝色的是页面文件,总大小为80.91KB,实际传输大小为81.27KB,

  响应时间1.06s,加载时间250.9ms。然后文件解析完成后,开始请求各个资源文件。

  这里可以看到两条虚线,蓝色的是DOMContent事件触发的时间,这里是3.38s,

  表示浏览器解析完文档(但其他资源如图片可能还没有下载),

  红色的是Load事件的触发时间,这里是2.75s,表示所有资源都已经加载完毕。

  第一次访问时必须请求所有资源,第二次访问时可以使用本地缓存的数据来加快资源加载。

  所以为不经常变化的静态资源设置一个过期时间,并告诉浏览器在一定时间内不需要重新加载这个资源。

  可以加快用户的重访速度,显着减少第四阶段的时间。

  此时间线不仅可以在本地浏览器中查看,也可以在相关测试网站中查看,

  比如阿里的阿里测试,Google Page Speed和Yahoo YSlow。

  有一个结合了Google Page Speed和YahooYSlow的工具,叫做GTMetrix,也是一个不错的工具。

  同时,这些网站也会为网站提供优化建议。

  还有一个工具叫17CE,可以同时测试不同地区测试服务器的响应时间和PING时间,

  可用于了解不同地区用户的访问速度。

  优化方法

  好了,有了相关的基础知识和工具,就​​可以进行针对性的优化了。下面分别说说如何优化每个部分:

  第一阶段,服务器响应时间,这部分基本没有什么好办法,如果是动态网站,

  主要是基于算法和数据库优化,以及使用AJAX异步读取数据,其实是后端的事情。

  我不会在这里讨论它。但是一个网站如果服务器合规时间超过2秒,

  基本上可以认为是服务器宕机了,一般应该控制在500ms以内,

  可能对人不明显,如果能控制在250ms以内就更好了。

  第二阶段是获取页面文件。第一,页面文件一般不大,都是纯文本。

  所以优化的方法是开启Gzip压缩,开启,

  对于Apache,先把httpd.conf中LoadModule deflate_modulemodules/mod_deflate.so前的#去掉,

  然后重启Apache,并添加.htaccess:

  AddOutputFilter DEFLATE html xml php js css text/htmltext/plain

  Gzip 压缩对这种比较松散的纯文本效果还是比较明显的。比如我的主页从50K压缩到了10K。

  也使用外部链接 CSS 文件。不要把样式表直接放到HTML页面中,这样可以缓存CSS文件。

  第三阶段,头部的资源文件主要是css和js文件。有几种方法:

  第四阶段,这个段是真正的大数据。现在用户的带宽通常不是问题。

  瓶颈主要在服务器上。想想看。如果一个页面需要 2MB 的数据才能完全加载,

  那么如果服务器的出口带宽只有1Mbps,所有的延迟都会被忽略。在只有一个用户访问的情况下,

  传输 2MB 的数据最快需要 16 秒。这是用户无法忍受的。

  所以对于阿里云的ECS,如果你是包月的,带宽不高,那么你必须尽量减少直接从ECS访问的所有资源。

  方法主要是使用OSS存储、CDN加速和GZip压缩。这个具体的优化很详细,力求尽量减少直接在ECS上访问的数据量。

  但是Wordpress很麻烦。系统自带的、插件中引用的一些js和CSS文件,不方便合并和更改位置。 . .

  只做尽可能多的优化。以我的网站为例,之前把所有的图片都放到CDN之后,

  加载首页还有大约220KB的数据要从ECS中取出,所以如果只有1Mbps的带宽,至少需要2秒。

  后来我把主题里的所有图片和bootstrap,jquery转CDN,加上GZip压缩,

  经过优化,现在只有80KB的数据,可以保证1秒内加载完毕。

  其他需要注意的事项包括:

  至于访问量巨大的网站,保存每一个字节很重要。还有更多优化方法。可以参考Google PageSpeed和

  Yahoo YSlow的页面评价结果,不过这两个服务器在国外,所以响应时间会长很多,这个数据可以忽略。

  最后说一下如何设置缓存时间。对于 Apache,

  首先将httpd.conf中LoadModule expires_modulemodules/mod_expires.so前的#去掉,然后重启Apache,

  然后在.htaccess中添加相应的代码来设置不同文件类型的缓存时间,

  以下设置为1个月的图片文件和JS文件,以及1年的图标文件:

  ExpiresActive OnExpiresByType image/jpg "access plus 1month"

  ExpiresByType image/jpeg“访问加1个月”

  ExpiresByType 图像/gif“访问加 1 个月”

  ExpiresByType image/png “访问加 1 个月”

  ExpiresByType text/x-javascript“访问加 1 个月”

  ExpiresByType 申请/x-shockwave-flash“访问加1个月”

  ExpiresByTypeimage/x-icon“访问加1年”

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线