在打开一个大的页面比较耗时的时候,我们总希望让用户先看到一部分结果,剩下的结果再一步步地显示出来,像现在微博这样,住下拉的时候再发送请求获取下一个分块的信息,微博的处理方式是通过JS 触发AJAX进行异步请求获取新的结果,AJAX请求这个方法是可行方案,但同样增加了用户的请求数,同时JS代码量也增加了很多。
对于目前这种情况,我们还有另一个处理方法,就是服务器response 的时候对服务器内容进行块处理。
普通页面处理方法如图:
如上图所示,服务器页面处理的时候,从上往下,一块一块地执行,取得结果并写入缓存中,我们先将页面分成 header ,N块内容block块,以及页脚,假如页头页脚执行我们不需要耗时间,但每一个block 却要花费上2秒,在这里我用sleep来模拟,那么,我们的页面每多一个block块,整个页面等待就要加多2秒,这样我们的页面越大,那等待的时间也就越长。我们用firebug 查看其执行时间分析如下图:
firebug 显示整个页面等待时间为4.09S,整个等待时间占了4S,也就是服务器响应处理时间为4S。
用flush() 实现块处理,代码如下
性能分析图
如果所示,firebug 显示响应头信息多了一项:Transfer-Encoding :chunked
时间线也分成了二段,总体时间虽还是4.044秒,但等待时间却已经变成了2秒,意思就是说在2秒的时候已经接收到服务器返回的信息了。所以页面显示内容也显示出block1 的内容,这样给用户的感觉是,页面已经在执行处理了,这样大大地提高了用户的体验效果。



