`
willko
  • 浏览: 386581 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PHP实时输出报文到浏览器

    博客分类:
  • php
阅读更多
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 报文 JAVA 输出 SOAP 报文是基于 SOAP 的通信协议,用于实现 ACS 通信过程中的报文交换。在 ACS 通信过程中,报文是硬编码编出来的,虽然能正确运行,但是实在是不雅。为了解决程序的掩护问题,这篇...

    将数据转换成motorola编码can报文&实时输出累计里程

    将数据转换成motorola编码can报文&实时输出累计里程

    JAVA输出soap报文[参考].pdf

    JAVA输出SOAP报文详解 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在不同的操作系统和编程语言之间交换结构化信息。SOAP报文是SOAP协议的核心组件,是一种轻量级的、基于XML的协议,可以在...

    V90PN伺服驱动器常用报文介绍(1号报文+111报文等).pdf

    此外,111报文还可以用于读取实时的电流、速度和位置数据,这在动态调试和性能分析中非常有用。 了解并掌握这些常用报文对于V90PN伺服驱动器的操作和维护至关重要。1号报文的使用可以帮助用户快速获取驱动器的常规...

    西门子报文_西门子报文_西门子1500报文_

    西门子报文是工业自动化领域中非常关键的一部分,特别是在使用西门子TIA Portal (全集成自动化)软件和S7-1500系列PLC时。这些报文是控制器与外部设备通信的载体,包含了丰富的信息,如状态、控制指令、数据交换等。...

    电信设备-无线通信系统中实时协议报文的传输方法.zip

    在无线通信系统中,实时协议报文的传输是通信领域中的关键环节,它涉及到网络的效率、稳定性和服务质量。此资料“电信设备-无线通信系统中实时协议报文的传输方法”深入探讨了如何在无线环境中高效、可靠地传递实时...

    SOP通讯报文格式文档

    输出信息报文格式详细定义了服务器响应客户端的数据包结构: 1. **系统信息头** 2. **交易返回公共信息头** - 包含交易的状态、结果等信息。 3. **业务数据部分** - 可能包含错误信息对象或正常交易对象等。 ###...

    网络游戏-避免网络交换芯片输出报文乱序的方法及系统.zip

    然而,由于网络环境的复杂性,特别是在高带宽、低延迟的需求下,网络交换芯片输出的报文可能会出现乱序现象,这对网络游戏的性能和玩家体验造成严重影响。本文将深入探讨如何避免这种报文乱序的问题以及相关的解决...

    通过访问指定端口转发报文,截获报文内容,soap报文,http报文

    HTTP(Hypertext Transfer Protocol)是互联网上应用最广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。HTTP报文分为请求报文和响应报文,前者由客户端发起,后者由服务器返回。请求报文包括方法...

    国南网报文解析V9.9.9.exe(698.45报文解析,南网规约报文解析,376报文解析,101/104报文解析)

    本人写的电力行业报文解析工具,单文件免安装,随存随用,详细解析到每个字节。支持如下规约: 1.698.45报文解析;2.南网规约报文解析;3.376.2报文解析(茜茜写的);4.376.1规约帧结构解析;5.645.07表规约帧结构解析...

    SNMP报文捕获分析

    启动Wireshark,设置监听接口为需要捕获数据的网络接口,然后在MIB浏览器中发送SNMP请求,Wireshark将捕获到这些报文。 捕获到SNMP报文后,我们需要分析其关键组成部分。首先是版本号,它指示了SNMP协议的版本,...

    北汽报文正常充电报文

    - **1820F8F4~182FF8F4**:这一系列的报文ID从0x1820F8F4到0x182FF8F4,覆盖了多种不同的功能,例如充电参数设置、状态反馈等。 - 其他ID:其他报文ID如1829F8F4、182AF8F4等,也可能代表着特定的功能或状态更新。 ...

    swift报文,银行报文

    而对于输出电文,则会记录发电时间、收电时间等关键时间戳。 3. **用户文首区段(Block 3)**:这个区段允许发送方添加自定义的参考信息,这些信息将在收报方接收的电文上显示,用于特定的业务处理或追踪。例如,`{...

    西门子标准报文1常用_西门子1500系列.html

    西门子标准报文1常用_西门子1500系列.html

    MAC Safari浏览器网络请求JSON报文格式化插件

    **MAC Safari浏览器网络请求JSON报文格式化插件** 在现代Web开发中,与服务器进行交互时,JSON(JavaScript Object Notation)已经成为一种常见的数据交换格式。它以其轻量级、易于阅读和编写的特点,被广泛应用于...

    实时计算Storm核心技术及其在报文系统中的应用.pdf

    Apache Storm作为一款流行的实时计算框架,被广泛应用于各种实时服务,包括报文系统。本篇文章将深入探讨Storm的核心技术和它在报文系统中的具体应用。 1.1 流式数据与Storm的诞生 流式数据是指源源不断、持续输入...

    ACARS报文参数的辨识

    然而,在实际应用过程中,由于传输差错、突发干扰以及人为因素的影响,如误码或报文丢失等现象时有发生,导致接收到的报文数据可能不符合规范。随着民航业的发展,ACARS报文的数量和种类不断增多,传统的报文处理...

    (精选)FPGA项目沙盘演练-基础版报文收发(vivado2017.4)

    1. 要求输出报文,且报文输出在报文长度输出之后,所以需要先对输入报文进行缓存,根据输入报文的位宽和长度范围,此处选择合适的同步FIFO即可;(如果是IC,那么就需要自己写FIFO,可以参考本博客的FIFO介绍) ...

    国标32960报文解析对比工具

    用户可以将单条或双条报文直接粘贴到软件中,程序会自动按照国标32960的结构进行解析,确保解析结果的准确性。这包括但不限于报文头、控制域、地址域、功能码、数据域以及校验码等关键元素的识别和解读。这样的功能...

    CXF 文件记录报文日志,非控制台打印。

    总的来说,通过适当配置日志框架,我们可以将CXF的服务报文日志记录到文件中,这有助于我们在不干扰正常运行的情况下收集和分析日志信息,对于优化服务性能、追踪问题以及满足合规性要求都具有重要意义。

Global site tag (gtag.js) - Google Analytics