我有一个成功运行了几个月的应用程序,它依赖于一个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了,虽然它的可靠性要差得多,但它的优点是我可以阅读它。