欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

chunked编码有关问题

程序员文章站 2024-02-02 08:35:58
...
chunked编码问题
PHP采集到的数据是chunked传输编码,gzip压缩格式的
chunk编码的思路貌似是:将数据分块传输,每一块分为头部和主体字段,头部包含主体信息的长度且以16进制表示,头部和主体以回车换行符分隔,最后一块以单行的0表示分块结束。。

响应头信息:



Array
(
[0] => HTTP/1.1 200 OK

[1] => Server: Dict/34002

[2] => Date: Wed, 17 Dec 2014 06:49:22 GMT

[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, 17 Dec 2014 04:57:49 GMT

[9] => Expires: Wed, 17 Dec 2014 06:49:22 GMT

[10] => Set-Cookie: uvid=VJEncoTSVYJC; expires=Thu, 31-Dec-37 23:55:55 GMT; domain=.dict.cn; 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(): data error in E:\CodeEdit\php\http\dict.php on line 384
偶尔能正常解析,应该是chunked解码有问题,查看过一些资料,也变换过集中解码方式,但还是功亏一篑
------解决思路----------------------
你可用 gzdecode 解码
chunked编码有关问题

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频