使用curl php

时间:2015-10-15 01:46:14

标签: php curl gzip deflate

我尝试了几种方法,然后想在这里问这个问题..我没办法成功...我正在尝试解码并从一个使用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

请帮助

2 个答案:

答案 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;


?>