我尝试了几种方法,然后想在这里问这个问题..我没办法成功...我正在尝试解码并从一个使用gzip的网站读取数据 我正在使用curl& PHP。当我尝试解码并打印结果时,我会得到一长串乱码特殊字符,例如:
JHWkdsU01EUXdWa1pXYTFOdFZsZFRiaz
VoVW14S2NGbFljRmRXYkdSWVpFZEdWRT
FYVWtoWmEyaExXVlpLTm1KR1VsWmlXR2
如果我运行下面的PHP脚本直接我得到错误像
PHP Warning: gzdecode(): data error in /var/www/mn.php on line 20
这是我目前的代码:
<?
$data_string = '9999';
$ch = curl_init('http://example.com/getN.php&keyword=');
curl_setopt( $ch, CURLOPT_USERAGENT, 'Darwin/15.0.0' );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept-Encoding: gzip, deflate',
'Content-Length: ' . strlen($data_string))
);
$result = gzdecode ( curl_exec($ch) );
curl_close($ch);
print_r($result);
?>
我也尝试通过
启用deflate模块 a2enmod deflate
/etc/init.d/apache2 restart
并从php.ini
启用zlib要么我试着直接测试
curl -sH 'Accept-encoding: gzip' http://example.com/getN.php&keyword=9999 | gunzip -
我得到了相同的结果 以及来自网站的信息
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 15 Oct 2015 00:41:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.31
X-Frame-Options: SAMEORIGIN
Content-Encoding: gzip
请帮助
答案 0 :(得分:2)
我注意到你的代码已经
了curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
稍后再拨gzdecode()
。如果指示接受编码内容,cURL会自动为您处理解码,而无需在curl_exec()
之后手动执行。如果您告诉cURL接受编码传输,则其返回值已经被解码。
也就是说,您尝试下载的页面可能实际上不是用gzip编码的,而是另一种方法。如manual中所述,请尝试指定一个空字符串:
# Enable all supported encoding types.
curl_setopt($ch, CURLOPT_ENCODING, '');
这将启用所有支持的编码类型。并且不要使用gzdecode()
。结果应该已经解码。
答案 1 :(得分:0)
谢谢大家,最后开始工作后我接受你的建议并删除gzdecode和其他一些并保持标题..接受编码到gzip和这里的最终代码
<?
$data_string = '9999';
$ch = curl_init('http://example.com/getN.php&keyword=');
curl_setopt( $ch, CURLOPT_USERAGENT, 'Darwin/15.0.0' );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept-Encoding: gzip',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
curl_close($ch);
print $result;
?>