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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 PHP
php中取得文件的后缀名?
Feb 20 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php动态函数调用方法
May 21 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
PHP中PDO事务处理操作示例
May 02 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
Yii框架布局文件的动态切换操作示例
Nov 11 PHP
PHP命令行与定时任务
Apr 01 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的FTP学习(二)
2006/10/09 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
详解vue中的computed的this指向问题
2018/12/05 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Flask-Mail用法实例分析
2018/07/21 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
精细化工应届生求职信
2013/11/17 职场文书
网站创业计划书
2014/04/30 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
交通事故协议书范文
2014/10/23 职场文书
先进单位事迹材料
2014/12/25 职场文书
三年级学生评语大全
2014/12/26 职场文书
三好学生评语大全
2014/12/29 职场文书
教务处教学工作总结
2015/08/10 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
vue自定义右键菜单之全局实现
2022/04/09 Vue.js