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
网站加速 PHP 缓冲的免费实现方法
Oct 09 PHP
php下实现农历日历的代码
Mar 07 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php生成shtml类用法实例
Dec 09 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
Oct 28 PHP
Smarty模板常见的简单应用分析
Nov 15 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递归列出所有文件和目录的代码
2008/09/10 PHP
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
php页面缓存方法小结
2015/01/10 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
vue组件命名和props命名代码详解
2019/09/01 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Python----数据预处理代码实例
2019/03/20 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
Python如何实现FTP功能
2020/05/28 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
Python list和str互转的实现示例
2020/11/16 Python
PyQt实现计数器的方法示例
2021/01/18 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
外国语学院毕业生自荐信
2013/10/28 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
读书笔记怎么写
2015/07/01 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript