chunked编码问题
PHP采集到的数据是chunked传输编码,gzip压缩格式的
chunk编码的思路貌似是:将数据分块传输,每一块分为头部和主体字段,头部包含主体信息的长度且以16进制表示,头部和主体以回车换行符分隔,最后一块以单行的0表示分块结束。。
响应头信息:
Array
(
[0]=>HTTP/1.1200OK
[1]=>Server:Dict/34002
[2]=>Date:Wed,17Dec06:49:22GMT
[3]=>Content-Type:text/html;charset=utf-8
[4]=>Transfer-Encoding:chunked
[5]=>Connection:keep-alive
[6]=>Keep-Alive:timeout=60
[7]=>Cache-Control:private
[8]=>Last-Modified:Wed,17Dec04:57:49GMT
[9]=>Expires:Wed,17Dec06:49:22GMT
[10]=>Set-Cookie:uvid=VJEncoTSVYJC;expires=Thu,31-Dec-3723:55:55GMT;domain=.;path=/
[11]=>Content-Encoding:gzip
)
if($this->response_num==200)
{
if($this->is_chunked)
{
//读取chunk头部信息,获取chunk主体信息的长度
$chunk_size=(int)hexdec(fgets($this->conn));
//
while(!feof($this->conn)&&$chunk_size>0)
{
//读取chunk头部指定长度的信息
$this->response_body.=fread($this->conn,$chunk_size);
fseek($this->conn,2,SEEK_CUR);
$chunk_size=(int)hexdec(fgets($this->conn,4096));
}
}
else
{
$len=0;
//读取请求返回的主体信息
while($items=fread($this->conn,$this->response_body_length))
{
$len=$len+strlen($items);
$this->response_body=$items;
//当读取完请求的主体信息后跳出循环,不这样做,貌似会被阻塞!!!
if($len>=$this->response_body_length)
{
break;
}
}
}
if($this->is_gzip)
{
$this->response_body=gzinflate(substr($this->response_body,10));
}
$this->getTrans($this->response_body);
}
基本上每次都会出现这个提示:
Warning:gzinflate():dataerrorinE:\CodeEdit\php\http\dict.phponline384
偶尔能正常解析,应该是chunked解码有问题,查看过一些资料,也变换过集中解码方式,但还是功亏一篑
------解决思路----------------------
你可用gzdecode解码