php curl采集,服务器gzip压缩返回数据怎么办

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php curl采集,服务器gzip压缩返回数据怎么办相关的知识,希望对你有一定的参考价值。

一般服务器不会胡乱返回gzip压缩的数据,一般是客户端请求的头部里包含你浏览器能接受的压缩方式,

Accept-Encoding:gzip,deflate,sdch
这里是gzip 、deflate、sdch这三种方式,这里不一一说明是指什么,不懂的可以去找谷哥度娘,
有些服务器强制返回gzip压缩的数据,我们采集的时候,返回的是乱码,根本无法读取使用,这个时候马上查看手册
发现其实curl里有个参数,curl_setopt($ch, CURLOPT_ENCODING,\'gzip\');
手册解释:
CURLOPT_ENCODING HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。
只要加上这句就OK了
参考技术A curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); 参考技术B exec shell

使用 PHP ob_start() 与 Apache Deflate/Gzip 压缩内容?

【中文标题】使用 PHP ob_start() 与 Apache Deflate/Gzip 压缩内容?【英文标题】:Compressing content with PHP ob_start() vs Apache Deflate/Gzip? 【发布时间】:2010-12-24 04:11:17 【问题描述】:

大多数网站都希望压缩其内容以节省带宽。然而,当涉及到运行 PHP 的 apache 服务器时,有两种方法可以做到这一点 - with PHP 或使用 apache。那么在您的服务器上哪一个更快或更容易?

例如,在 PHP 中,我在页面的开头运行以下函数来启用它:

/**
 * Gzip compress page output
 * Original function came from wordpress.org
 */
function gzip_compression() 

    //If no encoding was given - then it must not be able to accept gzip pages
    if( empty($_SERVER['HTTP_ACCEPT_ENCODING']) )  return false; 

    //If zlib is not ALREADY compressing the page - and ob_gzhandler is set
    if (( ini_get('zlib.output_compression') == 'On'
        OR ini_get('zlib.output_compression_level') > 0 )
        OR ini_get('output_handler') == 'ob_gzhandler' ) 
        return false;
    

    //Else if zlib is loaded start the compression.
    if ( extension_loaded( 'zlib' ) AND (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) ) 
        ob_start('ob_gzhandler');
    


other option 是使用 Apache deflate or gzip(两者都是very close)。要启用它们,您可以在 .htaccess 文件中添加类似的内容。

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php

由于 PHP 是一种脚本语言(必须由 PHP 加载),我认为 apache 方法会 1)更稳定,2)更快。但是假设在现实世界中没有多大用处。

毕竟,您会认为拥有庞大的财务支持窗口...,我们不会去那里。

【问题讨论】:

【参考方案1】:

我们正在运行...很多网络服务器,每天处理 60M/uniques。通常这不值得一提,但您的问题似乎是基于经验。

我们在 apache 中运行。无论您选择哪种方法,另一端的输出都是相同的(或足够接近以至于无关紧要)。

我们选择 apache 有几个原因:

零维护,我们刚刚开启。没有人需要维护某种案例结构 性能,在我们的测试服务器中,Apache 完成工作的服务器稍微好一点。 Apache 会将输出过滤器应用于所有内容,而不仅仅是 PHP。在某些情况下,同一服务器上提供其他类型的内容,我们希望压缩我们的 .css 和 .js

一个警告词,一些浏览器或其他应用程序故意破坏客户端标头,表明支持压缩。有些人这样做是为了减轻他们在客户端安全方面的工作(想想诺顿互联网安全等应用程序)。您可以忽略这一点,或者尝试添加额外的案例来重写请求以使其看起来正常(浏览器确实支持它,应用程序或代理只是为了让自己的生活更轻松而对其进行了改进)。

或者,如果您使用 flush() 命令更早地将输出发送到浏览器,并且您正在应用压缩,您可能需要在字符串的末尾用空格填充以说服服务器提前发送数据。

【讨论】:

+1:我几乎没有处理你的流量,但我也更喜欢服务器来处理它。有一两个警告:某些类型的声音文件不应该被压缩,否则媒体播放器会卡住它们。这包括带有 mp3 文件的 Windows Media Player。 虽然这个问题出在 Media Player 8 上,但现在可能已经解决了。 通常我只压缩 text/* 类型的项目,然后我会挑选更多的内容类型(如 application/json)来获取其余内容。

以上是关于php curl采集,服务器gzip压缩返回数据怎么办的主要内容,如果未能解决你的问题,请参考以下文章

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

php curl采集,服务器gzip压缩返回数据怎么办

使用PHP CURL函数采集gzip编码网页报错

使用 curl 解压 gzip 数据

nginx开启gzip