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 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
PHP中文编码小技巧
Dec 25 PHP
php实现源代码加密的方法
Jul 11 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
一段实用的php验证码函数
May 19 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
PHP 事务处理数据实现代码
2010/05/13 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
php数据序列化测试实例详解
2017/08/12 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JavaScript事件详细讲解
2016/06/27 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python基础教程之常用运算符
2014/08/29 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
法学函授自我鉴定
2014/02/06 职场文书
监察建议书范文
2014/03/12 职场文书
公司合作协议书范本
2014/04/18 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
工作试用期自我评价
2015/03/10 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技