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 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
php日历制作代码分享
Jan 20 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php实现简单的MVC框架实例
Sep 23 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 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 intval的测试代码发现问题
2008/07/27 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
php简单复制文件的方法
2016/05/09 PHP
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
JavaScript组件开发完整示例
2015/12/15 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
python pdb调试方法分享
2014/01/21 Python
深入浅析Python字符编码
2015/11/12 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python函数中不定长参数的写法
2019/02/13 Python
python适合人工智能的理由和优势
2019/06/28 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
七一表彰活动方案
2014/01/18 职场文书
安全生产专项整治方案
2014/05/06 职场文书
媒体宣传策划方案
2014/05/25 职场文书
合作经营协议书范本
2014/09/16 职场文书
群众路线专项整治方案
2014/10/27 职场文书