免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12061 | 回复: 11
打印 上一主题 下一主题

求助:chunked和content-length的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-09 18:06 |只看该作者 |倒序浏览
10可用积分
不解当什么情况才会使用chunked来传输,一直找不到相关资料.

经过反复测试:
发现当Content-Length的值大于8000之后,就变成使用chunked传输了.
是否和php配置有关?例如:buffer什么的

curl www.example.com/chunked/nolen.php?a=8001 -i
HTTP/1.1 200 OK
Date: Tue, 09 Jun 2009 09:59:42 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/4.3.9
Content-Length: 8000

curl www.example.com/chunked/nolen.php?a=8002 -i
HTTP/1.1 200 OK
Date: Tue, 09 Jun 2009 09:59:48 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/4.3.9
Transfer-Encoding: chunked


nolen.php如下:
<?

for($i=1;$i<$_GET[a];$i++){

echo "\r";

}
?>


[ 本帖最后由 meeslo 于 2009-6-9 18:08 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2009-06-09 18:13 |只看该作者
你找找php.ini 有没有 8K 8192 chunck之类的东西呢

论坛徽章:
0
3 [报告]
发表于 2009-06-09 18:21 |只看该作者

回复 #2 xinglp 的帖子

没找到相关的. 不过也可能是和apache有关.

论坛徽章:
0
4 [报告]
发表于 2009-06-10 00:58 |只看该作者
这是 web server 做的处理, 你不必担心它.

如果你是在编写http client处理时碰到它嫌麻烦, 你可以强制构造 HTTP/1.0 的请求, 就不会有 chunked 的处理了

论坛徽章:
0
5 [报告]
发表于 2009-06-10 08:51 |只看该作者
原帖由 hightman 于 2009-6-10 00:58 发表
这是 web server 做的处理, 你不必担心它.

如果你是在编写http client处理时碰到它嫌麻烦, 你可以强制构造 HTTP/1.0 的请求, 就不会有 chunked 的处理了

是HTTP 1.1里的?

论坛徽章:
0
6 [报告]
发表于 2009-06-10 08:59 |只看该作者
原帖由 smallfish_xy 于 2009-6-10 08:51 发表

是HTTP 1.1里的?


有疑问就GOOGLE一下, 参见 RFC2616

论坛徽章:
0
7 [报告]
发表于 2009-06-10 09:10 |只看该作者

回复 #4 hightman 的帖子

确实是不用担心,就是想知其所以然.
通常应该是无法预先计算长度的,会用chunked,如果是http1.0的就是服务端关闭持久连接(connection:close )解决.

上面的情况就不解是无法计算长度,还是超过一定范围也使用chunked

论坛徽章:
0
8 [报告]
发表于 2009-06-10 09:28 |只看该作者

回复 #1 meeslo 的帖子

http协议之chunk编码收藏



最近在尝试写一个接受apache返回时,发现apache的日志有时候会打印broken-pipe.但是我的程序中明明是等待读取apache为空时才返回的啊?查找原因发现。原来apache有时候不一定会在消息头里(Content-Length)中表明文件大小。而我的程序必须要读取content-length 才能正确读取。实际上apache 返回的是: Transfer-Encoding: chunked
正文将详细介绍chunk编码。

  在有时服务器生成HTTP回应是无法确定消息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。
  在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定为Chunked,表示将用Chunked编码传输内容。采用以下方式编码:
  Chunked-Body=*chunk
         "0"CRLF
         footer
         CRLF
  chunk=chunk-size[chunk-ext]CRLF
      chunk-dataCRLF

  hex-no-zero=<HEXexcluding"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
  编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。
  下面给出一个Chunked的解码过程(RFC文档中有)
  length:=0
  readchunk-size,chunk-ext(ifany)andCRLF
  while(chunk-size>0){
  readchunk-dataandCRLF
  appendchunk-datatoentity-body
  length:=length+chunk-size
  readchunk-sizeandCRLF
  }
  readentity-header
  while(entity-headernotempty){
  appendentity-headertoexistingheaderfields
  readentity-header
  }
  Content-Length:=length
  Remove"chunked"fromTransfer-Encoding
http协议之chunk编码 - Tech Blog of Legion.张玉谷(c30gcrk) - CSDN博客 (10 June 2009)
http://blog.csdn.net/c30gcrk/archive/2007/10/12/1821853.aspx

论坛徽章:
0
9 [报告]
发表于 2009-06-10 09:55 |只看该作者

回复 #8 ziggler 的帖子

原来apache有时候不一定会在消息头里(Content-Length)中表明文件大小

我想知道的就是什么时候会没有Content-Length,而用chunked.

论坛徽章:
0
10 [报告]
发表于 2009-06-10 10:16 |只看该作者
原帖由 meeslo 于 2009-6-10 09:10 发表
确实是不用担心,就是想知其所以然.
通常应该是无法预先计算长度的,会用chunked,如果是http1.0的就是服务端关闭持久连接(connection:close )解决.

上面的情况就不解是无法计算长度,还是超过一定范围也使用chunked


事实上, 并没有真正的无法计算长度, 否则HTTP/1.0不就不正常了, 在于web server比较喜欢把缓冲区满了就输出一次, 而不必等待你的PHP脚本完全运行完毕再统计长度.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP