$host="www.renren.com";
$request="GET / HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\nAccept-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\nAccept-Encoding: gzip, deflate\r\nHost: www.renren.com\r\nConnection: Keep-Alive\r\nCookie: _r01_=1; depovince=GW\r\n\r\n";$fp=fsockopen($host,80);
fputs($fp,$request);
$result="";
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);echo $result;
获取到的是Content-Encoding: gzip乱码
如果把Accept-Encoding: gzip, deflate改为Accept-Encoding: deflate可以
但是我想直接把gzip解压缩成正常代码
用gzuncompress 已经将http头去掉 还是提示data error
用其他函数直接显示空白
那位高手帮忙看下,急用谢谢

解决方案 »

  1.   

    试试接收字符串后 gzuncompress解压。 注意编码一致
      

  2.   

    nAccept-Encoding: gzip, deflate
    把这个从request里去掉即可。
      

  3.   

     主要是两个问题#1.返回头Transfer-Encoding: chunked表明是chunked的传输编码,这个意思是,服务器分批把http body返回给你
    比如http body如下 2   --表示下一个chunked的长度为2,这个数字是16进制,不是10进制
    ab --  长度为2的串
    3  -- 同上
    abc -- 长度为3的串
    1    -- 同上
    a     -- 长度为1的串
    0  -- 长度为0,这个是结束标识所以最终的http body应该是ababca ,长度标识是不需要的。#2.经过deflate的http body需要忽略前10个字符.header("content-type:text/html;charset=utf-8");
    $host="www.renren.com";
    $request="GET / HTTP/1.1\r\n"
    ."Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\n"
    ."Accept-Language: zh-cn\r\n"
    ."User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\n"
    ."Accept-Encoding: gzip, deflate\r\n"
    ."Host: www.renren.com\r\n"
    ."Connection:close\r\n"
    ."Cookie: _r01_=1; depovince=GW\r\n\r\n";$fp=fsockopen($host,80);
    fputs($fp,$request);
    $result="";
    while(!feof($fp)){
        $result.=fgets($fp,1024);
    }
    fclose($fp);
    $hb  = explode("\r\n\r\n",$result);//分隔http head和body
    $body     = $hb[1]; //http body
    $chunk = strtok($body,"\r\n");//获取第一个chunked string的16进制串长标识
    while( $len = (hexdec($chunk) + 0) ) //最后一个chunked string的串长铁定是0,这是协议规范
    {
    $start   = strlen($chunk) + 2;//从chunked标识后读取串, +2是因为还要考虑"\r\n"
    $bd   .= substr($body , $start , $len );//读取真正要decode的http body
    $body   = substr($body , $start + $len + 2); //body把上一个chunked去掉
    $chunk   = strtok($body,"\r\n");//查找下一个chunked长度标识
    }
    echo gzinflate(substr($bd,10));//忽略前10个字符
      

  4.   

    1楼用的解码法;
    2楼是发送请求时不发送支持解码信息,这样服务器一般不Response压缩数据。
      

  5.   

    如果是直接获取静态源代码的话,可以考虑使用CRUL类来完成,然后再进行相应操作,感觉会更简单一些
      

  6.   

    为嘛是PHP的 先哭一会儿。