霜天部落 | 专注PHP研发,研究LAMP高性能架构部署与优化

php使用fsockopen读取Transfer-Encoding:chunked编码数据

有时候,Web服务器生成HTTP Response是无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息,而采用Chunked编码动态的提供body内容的长度。

进行Chunked编码传输的HTTP Response会在消息头部设置:

Transfer-Encoding: chunked

表示Content Body将用Chunked编码传输内容。

Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。

比如在使用php fsockopen远程访问www.wtatour.com/page/RankingsSingles/0,,12781~0~1~100,00.html的时候就遇到了这个问题。


?>
响应头为:

HTTP/1.1 302 Moved Temporarily
Server: Sun-Java-System-Web-Server/7.0
Location: http://www.wtatennis.com/page/RankingsSingles/0,,12781~0~1~100,00.html
Content-Type: text/html
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 21 Mar 2011 14:28:42 GMT
Transfer-Encoding: chunked
Connection: close
Connection: Transfer-Encoding

00000014
…………
00000000

情况搞清楚了,那么我们怎么来解码这个编码后的数据呢?

在php官方手册fsockopen函数下面的评论中,已经有很多人提出了解决方法

方法一、


方法二、