PHP Curl为XML提要返回不一致的数据

PHP Curl为XML提要返回不一致的数据,php,xml,curl,rss,binary-data,Php,Xml,Curl,Rss,Binary Data,我正在开发一个XML读取器,在一些提要中遇到了一个奇怪的问题。使用CURL甚至file_get_内容,提要作为二进制数据加载的频率高于实际数据。每当我在浏览器中加载提要时,它看起来都很好 具体的饲料是 我使用的代码是 $string = file_get_contents("http://www.winnipegsun.com/home/rss.xml"); var_dump( $string ); 响应被压缩为: 如果查看HTTP标头: 内容编码:gzip 用PHP解压: gzinflate

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

具体的饲料是

我使用的代码是

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

响应被压缩为:

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

用PHP解压:

gzinflate(substr($string, 10));


希望这有助于。。。干杯

您应该能够向服务器发送一个空的
接受编码
标题,然后它不应该发送压缩的内容或返回
不可接受的
响应:

$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);
不过,我不确定Web服务器是否正确配置,因为它不会使用未压缩的提要响应,即使添加缓存控制头告诉它不要发送缓存响应。奇怪的是,只是在做

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

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

这确实有帮助。那么,在我将提要传递给简单xml之前,我是否应该检查提要的标题以查看它们是否已压缩?可能吗?或者尝试解压字符串会更简单吗?如果解压失败,则假定未解压?谢谢!我假设它是在那里:)为了回答我关于如何确定它是否是g-ZIP的问题,我找到了一个函数get_headers,并结合array_search编写了以下$string=file_get_contents($feed[1]);如果(array_search(“Content Encoding:gzip”,get_headers($feed[1])){$string=gzinflate(substr($string,10));}您肯定可以这样做。我将尝试将它应用到我围绕PHP Curl编写的HTTP客户机类中:并发布一些示例代码。我还听说人们对zend的http客户端非常满意:好吧,我给你写了一个新类。此降价文档中的示例代码直接应用于您。去加拿大!:-)服务器是否会返回该页面的gzip缓存版本?这也许可以解释为什么它有时会工作(缓存过期),然后在接下来的几个请求中失败(缓存正在返回)。。。。不幸的是,它不是我的服务器,只是我必须处理的数据。但这也许可以解释为什么添加一个get参数可以解决这个问题。@Jeff我不知道是什么原因造成的。我怀疑它是一个缓存版本,因为响应头表明它是通过缓存服务器发送的,但我尝试发送一个缓存控件:没有缓存头,这不会起任何作用。它也不能解释为什么我可以完全忽略接受编码而只添加time()参数。这很奇怪。