搜索
首页php教程php手册PHP实时输出报文到浏览器

PHP实时输出报文到浏览器

Jun 13, 2016 am 10:47 AM
headhtmlphpyahoo优化前端实时实践浏览器输出

Yahoo的前端优化实践中有一条是先把html里的

部分先输出(Flush the Buffer Early),这样做浏览器得到head后能先下载head里的css/js文件,而不用等到整个html下载完了才去下载head里的css/js,从而提高网页打开的速度。
 
http1.1里增加了一个Transfer-Encoding: chunked报头,这个报头的作用可以把报文分成多块输出。
 
报文的格式如下:
Java代码 
  Chunked-Body = *chunk  
         "0" CRLF  
         footer  
         CRLF   
  chunk = chunk-size [ chunk-ext ] CRLF  
      chunk-data CRLF  
  hex-no-zero =   
  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 
 
  Chunked-Body = *chunk
         "0" CRLF
         footer
         CRLF
  chunk = chunk-size [ chunk-ext ] CRLF
      chunk-data CRLF
  hex-no-zero =
  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:回车换行(rn)
例如:
Java代码 
...                          #很多报头  
Transfer-Encoding: chunked   #报头2个CRLE后开始报文  
                               
1                            #chunk的大小,十六进制,然后加个CRLE  
a                            #chunk数据,然后加个CRLE  
4                            #chunk的大小,十六进制,然后加个CRLE  
test                         #chunk数据,可以不断循环分块输出,然后加个CRLE  
0                            #chunk结束,0 2个CRLE 
 
...                          #很多报头
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的区别
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境