php下HTTP Response中的Chunked编码实现方法


Posted in PHP onNovember 19, 2008

进行Chunked编码传输的HTTP Response会在消息头部设置:
Transfer-Encoding: chunked
表示Content Body将用Chunked编码传输内容。
Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。具体的Chunk编码格式如下:

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

RFC文档中的Chunked解码过程如下:
length := 0 

read chunk-size, chunk-ext (if any) and CRLF 

while (chunk-size > 0) { 

read chunk-data and CRLF 

append chunk-data to entity-body 

length := length + chunk-size 

read chunk-size and CRLF 

} 

read entity-header 

while (entity-header not empty) { 

append entity-header to existing header fields 

read entity-header 

} 

Content-Length := length 

Remove "chunked" from Transfer-Encoding

最后提供一段PHP版本的chunked解码代码:
$chunk_size = (integer)hexdec(fgets( $socket_fd, 4096 ) ); 
while(!feof($socket_fd) && $chunk_size > 0) { 
$bodyContent .= fread( $socket_fd, $chunk_size ); 
fread( $socket_fd, 2 ); // skip \r\n 
$chunk_size = (integer)hexdec(fgets( $socket_fd, 4096 ) ); 
}
PHP 相关文章推荐
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
ThinkPHP关联模型操作实例分析
Sep 23 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 PHP
PHP分页显示制作详细讲解
Nov 19 #PHP
php在字符串中查找另一个字符串
Nov 19 #PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 #PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 #PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 #PHP
利用discuz实现PHP大文件上传应用实例代码
Nov 14 #PHP
php下载远程文件类(支持断点续传)
Nov 14 #PHP
You might like
php遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
浅析Python中else语句块的使用技巧
2016/06/16 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
python 解压pkl文件的方法
2018/10/25 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
深入浅析python的第三方库pandas
2020/02/13 Python
python设置表格边框的具体方法
2020/07/17 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
社区志愿者活动方案
2014/08/18 职场文书
法院授权委托书格式
2014/09/28 职场文书
2014年司法所工作总结
2014/11/22 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python