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 报文 JAVA 输出 SOAP 报文是基于 SOAP 的通信协议,用于实现 ACS 通信过程中的报文交换。在 ACS 通信过程中,报文是硬编码编出来的,虽然能正确运行,但是实在是不雅。为了解决程序的掩护问题,这篇...
将数据转换成motorola编码can报文&实时输出累计里程
JAVA输出SOAP报文详解 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在不同的操作系统和编程语言之间交换结构化信息。SOAP报文是SOAP协议的核心组件,是一种轻量级的、基于XML的协议,可以在...
此外,111报文还可以用于读取实时的电流、速度和位置数据,这在动态调试和性能分析中非常有用。 了解并掌握这些常用报文对于V90PN伺服驱动器的操作和维护至关重要。1号报文的使用可以帮助用户快速获取驱动器的常规...
西门子报文是工业自动化领域中非常关键的一部分,特别是在使用西门子TIA Portal (全集成自动化)软件和S7-1500系列PLC时。这些报文是控制器与外部设备通信的载体,包含了丰富的信息,如状态、控制指令、数据交换等。...
在无线通信系统中,实时协议报文的传输是通信领域中的关键环节,它涉及到网络的效率、稳定性和服务质量。此资料“电信设备-无线通信系统中实时协议报文的传输方法”深入探讨了如何在无线环境中高效、可靠地传递实时...
输出信息报文格式详细定义了服务器响应客户端的数据包结构: 1. **系统信息头** 2. **交易返回公共信息头** - 包含交易的状态、结果等信息。 3. **业务数据部分** - 可能包含错误信息对象或正常交易对象等。 ###...
然而,由于网络环境的复杂性,特别是在高带宽、低延迟的需求下,网络交换芯片输出的报文可能会出现乱序现象,这对网络游戏的性能和玩家体验造成严重影响。本文将深入探讨如何避免这种报文乱序的问题以及相关的解决...
HTTP(Hypertext Transfer Protocol)是互联网上应用最广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。HTTP报文分为请求报文和响应报文,前者由客户端发起,后者由服务器返回。请求报文包括方法...
本人写的电力行业报文解析工具,单文件免安装,随存随用,详细解析到每个字节。支持如下规约: 1.698.45报文解析;2.南网规约报文解析;3.376.2报文解析(茜茜写的);4.376.1规约帧结构解析;5.645.07表规约帧结构解析...
启动Wireshark,设置监听接口为需要捕获数据的网络接口,然后在MIB浏览器中发送SNMP请求,Wireshark将捕获到这些报文。 捕获到SNMP报文后,我们需要分析其关键组成部分。首先是版本号,它指示了SNMP协议的版本,...
- **1820F8F4~182FF8F4**:这一系列的报文ID从0x1820F8F4到0x182FF8F4,覆盖了多种不同的功能,例如充电参数设置、状态反馈等。 - 其他ID:其他报文ID如1829F8F4、182AF8F4等,也可能代表着特定的功能或状态更新。 ...
而对于输出电文,则会记录发电时间、收电时间等关键时间戳。 3. **用户文首区段(Block 3)**:这个区段允许发送方添加自定义的参考信息,这些信息将在收报方接收的电文上显示,用于特定的业务处理或追踪。例如,`{...
西门子标准报文1常用_西门子1500系列.html
**MAC Safari浏览器网络请求JSON报文格式化插件** 在现代Web开发中,与服务器进行交互时,JSON(JavaScript Object Notation)已经成为一种常见的数据交换格式。它以其轻量级、易于阅读和编写的特点,被广泛应用于...
Apache Storm作为一款流行的实时计算框架,被广泛应用于各种实时服务,包括报文系统。本篇文章将深入探讨Storm的核心技术和它在报文系统中的具体应用。 1.1 流式数据与Storm的诞生 流式数据是指源源不断、持续输入...
然而,在实际应用过程中,由于传输差错、突发干扰以及人为因素的影响,如误码或报文丢失等现象时有发生,导致接收到的报文数据可能不符合规范。随着民航业的发展,ACARS报文的数量和种类不断增多,传统的报文处理...
1. 要求输出报文,且报文输出在报文长度输出之后,所以需要先对输入报文进行缓存,根据输入报文的位宽和长度范围,此处选择合适的同步FIFO即可;(如果是IC,那么就需要自己写FIFO,可以参考本博客的FIFO介绍) ...
用户可以将单条或双条报文直接粘贴到软件中,程序会自动按照国标32960的结构进行解析,确保解析结果的准确性。这包括但不限于报文头、控制域、地址域、功能码、数据域以及校验码等关键元素的识别和解读。这样的功能...
总的来说,通过适当配置日志框架,我们可以将CXF的服务报文日志记录到文件中,这有助于我们在不干扰正常运行的情况下收集和分析日志信息,对于优化服务性能、追踪问题以及满足合规性要求都具有重要意义。