php curl响应显示gzip或编码数据

时间:2018-08-26 12:18:25

标签: php curl

我正在使用以下脚本从网站获取数据。数据已返回,但格式为gzip或某些编码格式。我尝试使用gzdecode,但无法正常运行。有什么办法可以查看此请求中的干净数据。

我使用

                curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
                curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
                curl_setopt($ch, CURLOPT_ENCODING , 'br');

,但是它们都不起作用。下面是curl请求

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_URL, 'https://www.example.com');
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
            curl_setopt($ch, CURLOPT_TIMEOUT, 20);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
            $response = curl_exec($ch);

            $d = curl_getinfo( $ch );

curl_getinfo显示在下方

我可以看到该网站正在使用“ br”编码,即Content-Encoding:br

3 个答案:

答案 0 :(得分:0)

br编码是Brotli编码。您可以使用Accept-Encodingcurl_setopt($ch, CURLOPT_ENCODING , 'br')标头中传递它,但是curl不会处理它,即,您必须显式地解码输出。

您可能可以使用以下PHP扩展名:https://github.com/kjdev/php-ext-brotli

您还可以尝试使用curl_setopt($ch, CURLOPT_ENCODING , 'identity'),并且如果要调用的服务器运行正常,则可以将数据解压缩。

我猜您已经尝试完全省略Accept-Encoding标头。遗憾的是,根据the specs,这不会阻止对输出进行编码。

答案 1 :(得分:0)

在标题中,我只允许gzip和deflate并删除了br,它对我有用。因此,我使用$header[] = 'Accept-Encoding: gzip, deflate, br';

代替了$header[] = 'Accept-Encoding: gzip, deflate';

感谢大家的帮助。

答案 2 :(得分:0)

            curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
            curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
            curl_setopt($ch, CURLOPT_ENCODING , 'br');

后续调用将覆盖先前的值,它不会添加到先前的值。如果要支持deflategzipbr,请用逗号分隔,例如

            curl_setopt($ch, CURLOPT_ENCODING , 'gzip,deflate,br');

但是,br是curl的最新成员,br支持最初是在7.57.0版的curl中添加的,该版本于November 29 2017发布,因此您可能要添加

if(!definied("CURL_VERSION_BROTLI")){
// https://github.com/curl/curl/blob/f762fec323f36fd7da7ad6eddfbbae940ec3229e/include/curl/curl.h#L2720
    define("CURL_VERSION_BROTLI",(1<<23));
}
if(!(curl_version()["features"] & CURL_VERSION_BROTLI)){
    throw new \RuntimeException("this script requires brotli support added to libcurl (added in libcurl version 7.57.0, released November 29 2017), please update your libcurl installation.");
}

如果需要,请确保php的libcurl实际上支持br。