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 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
PHP 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
php跨服务器访问方法小结
May 12 PHP
php中删除、清空session的方式总结
Oct 09 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
Apr 12 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
Feb 08 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
laravel框架的安装与路由实例分析
Oct 11 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获取文件名后缀
2013/06/09 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
python如何保存文本文件
2020/06/07 Python
为什么说python更适合树莓派编程
2020/07/20 Python
C++面试题:关于链表和指针
2013/06/05 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
2016自主招生校长推荐信范文
2015/03/23 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python