无法在服务器上下载XML文件,在其他服务器上可以正常工作


Unable to download XML file on server, works fine on other

我有一个成功运行了几个月的应用程序,它依赖于一个cron作业来获取空气污染统计数据的xml提要。自1月份以来,它一直运行无误,但今天早上7点开始,它没有读取数据。相关代码如下:

<?php
define('FEED_URL', 'http://www.beijingaqifeed.com/BeijingAQI/BeijingAir.xml');
$contents = file_get_contents(FEED_URL);
if ($contents === false) echo "READ FAILED";
echo "FILE_GET_CONTENTS SIZE IS " . strlen($contents) . "<br>'n";

如果我在家里的机器上运行这个,它可以工作:

FILE_GET_CONTENTS SIZE IS 21538

如果它在我的服务器上运行,它不会:

FILE_GET_CONTENTS SIZE IS 0

我已经确认了服务器站点的支持,他们可以浏览url并查看xml数据,所以没有防火墙或任何阻止这一点。而且,正如我所说,直到今天早上,这已经成功工作了1000多次(根据我数据库中的条目来衡量),现在它总是失败。我和数据供应商没有关系,所以我无法从他们的角度进行调查。

谁能建议为什么这开始失败,我可以尝试做什么?我尝试了read()和file(),结果相同。

谢谢…

(我已经检查了allow_url_fopen是打开的)

在这种情况下,可能是服务器上的东西阻塞了您的PHP,可能是操作系统更新,或类似的东西。在过去我也遇到过类似的问题,但是,我的问题是关于无法杀死的守护进程,与cron job相连,所以,我和支持团队在关闭它时非常头疼。在这种情况下,这对于进一步的调查是至关重要的,这一行:FILE_GET_CONTENTS SIZE是21538,如果有人可以获取并读取它,那就有问题了。这个答案可能一点帮助都没有,但是,正如我所说的,错误行是关键。

奇怪,我刚刚检查了XML URL,它正常工作,因为它应该。

可能是权限问题。尝试在file_get_contents之后添加以下内容以查看它们的响应

if (!empty($http_response_header))
{
  var_dump($http_response_header); 
  //to see what tou get back
}

一开始我以为是权限,但事实并非如此。

尝试更换服务器,也许你的IP被阻塞或其他什么?

<?php
function download($website){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$path);
    curl_setopt($ch, CURLOPT_FAILONERROR,1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $retValue = curl_exec($ch);          
    curl_close($ch);
    return $retValue;
}
$XML = download('http://www.beijingaqifeed.com/BeijingAQI/BeijingAir.xml');
var_dump($XML);

执行:

wget http://www.beijingaqifeed.com/BeijingAQI/BeijingAir.xml通过SSH(如果可能的话)并查看响应

很可能有500个错误,所以-他们这边。这取决于他们使用什么,但是许多管理员(像我一样)避免指出服务器错误,用无用的注释代替它们,或者简单地通过删除它们来代替它们。这样做是为了防止入侵者,因为错误代码可能会将攻击者粘在我管理的服务器上,如果它宕机-我的错。

这不是最终答案,但它在一定程度上澄清了事情。我尝试将文件上传到服务器并以相同的方式从那里读取它(http:/young-0/testfile.xml),它成功了。然后我尝试从服务器获取"http://www.beijingaqifeed.com"-失败了。所以这个bug是一个转移注意力的问题,连接要么是被我的服务提供商(他们说不是他们)阻止了,要么是网站拒绝了我服务器的连接——感谢所有帮助过我的人。

现在我已经恢复使用twitter feed了,虽然它的可靠性要差得多,但它的优点是我可以阅读它。