Yahoo的前端优化实践中有一条是先把html里的<head>部分先输出(
Flush the Buffer Early),这样做浏览器得到head后能先下载head里的css/js文件,而不用等到整个html下载完了才去下载head里的css/js,从而提高网页打开的速度。
http1.1里增加了一个Transfer-Encoding: chunked报头,这个报头的作用可以把报文分成多块输出。
报文的格式如下:
Chunked-Body = *chunk
"0" CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
hex-no-zero = <HEX excluding "0">
chunk-size = hex-no-zero *HEX
chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(OCTET)
footer = *entity-header
CRLE:回车换行(\r\n)
例如:
... #很多报头
Transfer-Encoding: chunked #报头2个CRLE后开始报文
1 #chunk的大小,十六进制,然后加个CRLE
a #chunk数据,然后加个CRLE
4 #chunk的大小,十六进制,然后加个CRLE
test #chunk数据,可以不断循环分块输出,然后加个CRLE
0 #chunk结束,0 + 2个CRLE
在php里使用ob_flush后,将自动加上Transfer-Encoding: chunked报头实现分块输出,但是在使用过程中经常达不到效果。不得不考虑一些问题
一、php的缓冲区
如果你的php是以apache模块运行,那请使用flush函数来通知php输出。如果是以fastcgi模式运行则使用ob_flush通知php。这时gzip将失效,Chunked方式不支持每块都独立压缩。只能全部输出压缩后,将压缩包分块输出。为了保证兼容性,先调用ob_flush,再调用flush。
二、浏览器的缓冲区
当遇到Transfer-Encoding: chunked报头后,浏览器做什么反应,这个还是要看浏览器的实现了。在我的实验中,firefox不管chunk数据大小都会做实时显示,而ie8和chrome则需要一定长度后才显示。所以,需要先输出一定的大小后某些浏览器才有效果。
三、反向代理服务器
你使用的反向代理服务器支持http1.1协议吗?它是怎么处理后端是chunked方式的?proxy缓冲没满之前遇到chunked会按照后端来输出吗?
nginx的proxy功能只支持http1.0,并且它只有proxy buffer满了才会输出。
四、FastCGI缓冲
如果以FastCGI模式运行,可能Web Server有自己的fastcgi缓冲,等待缓冲满了才输出(nginx就这样)。flush函数只能通知php的output缓冲输出。
参考资料:
Chunked transfer encoding
Hypertext Transfer Protocol -- HTTP/1.1 Chunked transfer encoding
深入理解ob_flush和flush的区别
分享到:
相关推荐
JAVA输出soap报文.pdf
JAVA输出soap报文[参考].pdf
V90PN伺服驱动器常用报文介绍(1号报文+111报文等)
网络游戏-避免网络交换芯片输出报文乱序的方法及系统.zip
本人写的电力行业报文解析工具,单文件免安装,随存随用,详细解析到每个字节。支持如下规约: 1.698.45报文解析;2.南网规约报文解析;3.376.2报文解析(茜茜写的);4.376.1规约帧结构解析;5.645.07表规约帧结构解析...
SOP通讯报文格式文档,详细介绍SOP通讯报文格式。
java对象与json报文、xml报文的转换,json与xml报文的转换,适合新手理解报文转换以及格式
电信设备-无线通信系统中实时协议报文的传输方法.zip
西门子TIA S7-1500常用报文格式,中英文。
1. 要求输出报文,且报文输出在报文长度输出之后,所以需要先对输入报文进行缓存,根据输入报文的位宽和长度范围,此处选择合适的同步FIFO即可;(如果是IC,那么就需要自己写FIFO,可以参考本博客的FIFO介绍) ...
swift报文资料,银行之间发送报文资料
本软件可以模拟不同类型的交易报文,可以对交易测试案例进行统一管理,并可以进行简单时间统计和成功率统计。 使用本软件可以减轻传统测试过程中的修改-编译-测试-的循环等待时间,在测试过程中可以根据需要随时...
① 了解和掌握以太网帧,IP数据报,TCP报文段格式 ② 了解应用层协议的工作过程 ...② 在VC6.0下编写“wincap.txt”的报文代码分析程序,程序输出结果为:应用程序运行时的交互式过程(即逐次输出命令、应答)
网络请求JSON报文可视化格式插件,网络请求数据在浏览器中显示,有时错乱,格式错乱,显示杂乱,该插件能在Safari浏览器中自动对返回报文JSON格式化。双击-信任-添加到Safari浏览器的插件中。
本工程旨在降低开发人员的组拆报文的工作量,用最小的配置即可完成报文到java对象、java对象到报文的转换过程;同时测试代码提供了对象到报文,再到写报文到FTP目录中;以及根据文件名,解析文件返回java对象;提供...
TBOX 上传到服务器的数据, 在串口都有一个同步输出,串口输出的数据可读性差,必须解析才看得懂。 利用串口接收的数据,按照GB32960进行解析,就可以读懂TBOX上传信息。解析文件可保存为EXCEL格式。 1. 点击右上角...
采用httpclient发送xml报文,httpServer接收报文。两个程序一看就明白可以直接调用执行不在多说。
通过访问指定端口转发报文,截获报文内容,soap报文,http报文
java http 发送xml报文(java发送xml报文实例+参数)java http 发送xml报文java http 发送xml报文(java发送xml报文实例+参数)
java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http 发送xml报文java http ...