【问题标题】:PHP Curl returning inconsistent data for XML feedPHP Curl 为 XML 提要返回不一致的数据
【发布时间】:2011-08-10 14:44:45
【问题描述】:

我正在开发一个 XML 阅读器,但在一些提要中遇到了一个奇怪的问题。使用 CURL 甚至 file_get_contents 提要作为二进制数据加载的频率高于真实数据。每当我在浏览器中加载提要时,它看起来都很好。

具体提要是http://www.winnipegsun.com/home/rss.xml

我使用的代码是

$string = file_get_contents("http://www.winnipegsun.com/home/rss.xml");
var_dump( $string );

【问题讨论】:

    标签: php xml curl rss binary-data


    【解决方案1】:

    您应该能够向服务器发送一个空的Accept-Encoding 标头,然后它不应该发送压缩后的内容或返回Not Acceptable 响应:

    $string = file_get_contents(
        "http://www.winnipegsun.com/home/rss.xml",
        FALSE,
        stream_context_create(
            array(
                'http' => array(
                    'method'  => "GET",
                    'headers' => 'Accept-Encoding:\r\n'
                )
            )
        )
    );
    var_dump($string);
    

    我不确定网络服务器是否配置正确,因为它不会用未压缩的提要响应它,即使添加缓存控制标头告诉它不发送缓存响应也是如此。奇怪的是,只是在做

    $string = file_get_contents("http://www.winnipegsun.com/home/rss.xml?".time());
    

    开箱即用。您还可以发送 POST 请求。

    【讨论】:

    • 服务器能否返回页面的 gzip 缓存版本?这可以解释为什么它有时会工作(缓存过期)然后对于接下来的几个请求它失败(缓存正在返回)......不幸的是它不是我的服务器,只是我必须处理的数据。但这可以解释为什么添加时间参数可以解决问题。
    • @Jeff 我不确定是什么原因造成的。我怀疑它是缓存版本,因为响应标头表明它来自缓存服务器,但我尝试发送一个 Cache-Control: No-Cache 标头,但什么也没做。它也没有解释为什么我可以完全忽略 Accept-Encoding 而只添加 time() 参数。很奇怪。
    【解决方案2】:

    响应被压缩:

    如果您查看 HTTP 标头: 内容编码:gzip

    用 PHP 解压:

    gzinflate(substr($string, 10));
    

    http://php.net/manual/en/function.gzinflate.php

    希望对您有所帮助...干杯

    【讨论】:

    • 确实有帮助。那么,在将提要传递给简单的 xml 之前,我是否应该检查提要的标题以查看它们是否已压缩?那可能吗?或者尝试解压缩字符串是否更简单,如果失败则假设它没有被压缩?
    • 谢谢!我认为它在那里结束:) 为了回答我关于如何确定它是否是 g 压缩的问题,我找到了一个函数 get_headers,并结合 array_search 我写了以下 $string = file_get_contents($feed[1]); if(array_search("Content-Encoding: gzip", get_headers($feed[1]))) { $string = gzinflate(substr($string, 10)); }
    • 你绝对可以做到。我将尝试将它应用到我围绕 PHP Curl 编写的 HTTP 客户端类中:github.com/homer6/altumo/blob/master/source/php/Http/…,我将发布一些示例代码。我还听说人们对 zend 的 http 客户端非常满意:framework.zend.com/manual/en/zend.http.client.adapters.html
    • 好的,所以我给你写了一个新类。此降价文档中的示例代码直接适用于您。 github.com/homer6/altumo/blob/master/source/php/Http/…去加拿大! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2014-04-23
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多