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 相关文章推荐
模仿OSO的论坛(二)
Oct 09 PHP
php下使用无限生命期Session的方法
Mar 16 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
php使用百度天气接口示例
Apr 22 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
Yii redis集合的基本使用教程
Jun 14 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邮件类
2007/01/03 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
JS hashMap实例详解
2016/05/26 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
Python闭包实现计数器的方法
2015/05/05 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
对python模块中多个类的用法详解
2019/01/10 Python
详解Python3 基本数据类型
2019/04/19 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
python绘制雷达图实例讲解
2021/01/03 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
介绍Java的内部类
2012/10/27 面试题
自我评价范文点评
2013/12/04 职场文书
室内设计专业自荐信
2014/05/31 职场文书
小学开学标语
2014/07/01 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
董事长致辞
2015/07/29 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
JavaScript获取URL参数的方法分享
2022/04/07 Javascript