奇怪的是有时可以获取到结果,比如:
int.(打招呼)喂;你好
有时提示错误,比如:
Warning: gzinflate(): data error in E:\CodeEdit\php\http\dict.php on line 380估计错误还是出现在chunked解码这块,这里的问题是返回的数据是先经过gzip压缩,然后通过chunked分块传输的,所以解码的过程就是反过来的

解决方案 »

  1.   

    if($this->is_chunked)
    {
    /* //读取chunk头部信息,获取chunk主体信息的长度
    $chunk_size = (int)hexdec(trim(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);
    $next_line = trim(fgets($this->conn));
    if($next_line === '0')
    {
    echo $next_line;exit();
    }
    else
    {
    $chunk_size = (int)hexdec($next_line);
    }

       } */
    while(!feof($this->conn))
    {
    $this->response_body .= fread($this->conn, 1024);
    }
    if(preg_match_all("#\r\n#i", $this->response_body, $match))
    {
    $result=preg_split("#\r\n#i", $this->response_body, -1, PREG_SPLIT_NO_EMPTY );
    // echo "<pre>";
    // print_r($result); 
    /* foreach($result as $v)
    {
    echo $v."<br /><hr />";
    }
    echo "<hr />"; */
    /*  echo hexdec($result[0])."<br />";
    echo mb_strlen($result[1])+mb_strlen($result[2])."<br />"; */

    $len = count($result);
    $this->response_body='';
    for($i=1; $i<$len-1; $i++)
    {
    $this->response_body .= $result[$i];
    }
    //echo strlen($this->response_body); exit();
    }
    else
    {
    die("匹配结束符失败");
    }
    }
    基本思路,首先把头部改成connection:close,这样可以通过while(!feof($this->conn))一次性读取所有的数据然后因为chunk分块传输的头部和主体之间是用回车换行分隔的,所以直接用正则分割,得到一个数组包含数据长度和数据的数组,第一项表示所有数据的总长度(而不是每一个chunk分块的长度,这个貌似和chunk编码有点出入,也难怪按照chunk编码会失败,),最后一个数组项为0表示结束.反复测试,OK了