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 年龄计算函数(精确到天)
Jun 07 PHP
PHP中计算字符串相似度的函数代码
Dec 29 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
php显示时间常用方法小结
Jun 05 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
php实现图片等比例缩放代码
Jul 23 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
php 数据结构之链表队列
Oct 17 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
pandas DataFrame运算的实现
2020/06/14 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
精伦电子Java笔试题
2013/01/16 面试题
宿舍违规检讨书
2014/01/12 职场文书
好人好事事迹材料
2014/02/12 职场文书
主题实践活动总结
2014/05/08 职场文书
求职信模板
2014/05/23 职场文书
给校长的一封检讨书
2014/09/20 职场文书
项目合作意向书
2015/05/08 职场文书
公司联欢会主持词
2015/07/04 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书