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无限分类源码分享(思路不错)
Oct 13 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
利用php_imagick实现复古效果的方法
Oct 18 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 PHP
PHP+jQuery实现即点即改功能示例
Feb 21 PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 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
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
比较搞笑的js陷阱题
2010/02/07 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
javascript常用的设计模式
2017/02/09 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
分析Python中解析构建数据知识
2018/01/20 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
python简单验证码识别的实现方法
2019/05/10 Python
python如何读取bin文件并下发串口
2019/07/05 Python
在python image 中实现安装中文字体
2020/05/16 Python
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
材料化学专业求职信
2014/07/15 职场文书
服务员态度差检讨书
2014/10/28 职场文书
PHP中->和=>的意思
2021/03/31 PHP
压缩Redis里的字符串大对象操作
2021/06/23 Redis