我已经成功运行了几个月的应用程序,它依赖于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
我已经确认服务器站点的支持,他们可以浏览网址并查看xml数据,因此没有防火墙或阻止此操作的任何内容。并且,正如我所说,这已经成功地工作了1000多次(根据我的数据库中的条目来衡量)直到今天早上,现在它总是失败。我与数据供应商没有联系,所以我不能从他们这边调查。
任何人都可以建议为什么这开始失败,我可以尝试做什么?我尝试了fread()和file(),结果相同。
...谢谢
(我已检查过allow_url_fopen已开启)
答案 0 :(得分:0)
首先我认为这是权限,但事实并非如此。
尝试更改服务器,也许你的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(如果可能)并查看响应。
答案 1 :(得分:0)
在这种情况下,可能是服务器阻止你的PHP,可能是操作系统更新,或类似的东西。在过去我遇到了类似的问题,但是,地雷是关于无法使用的守护进程,与cron工作有关,因此,我和支持团队有很大的麻烦将其关闭。在这种情况下,这对于进一步调查至关重要,这一行:FILE_GET_CONTENTS SIZE是21538,如果有人能够获得并阅读它,那就是捕获。这个答案可能根本没有帮助,但是,正如我所说,错误行是关键。
奇怪的是,我刚刚检查了XML URL,它通常可以正常工作。
答案 2 :(得分:0)
可能是许可问题。尝试在file_get_contents
之后添加以下内容以查看其回复
if (!empty($http_response_header))
{
var_dump($http_response_header);
//to see what tou get back
}
答案 3 :(得分:0)
最有可能是500错误,所以 - 他们的一面。取决于他们使用什么,但许多管理员(像我一样)避免指出服务器错误,用无用的评论替换它们或简单地通过删除它们。这样做是为了防止入侵者,因为错误代码可能会在我的管理下将攻击者粘在服务器上,如果它崩溃了 - 我的错。
答案 4 :(得分:0)
这不是最终答案,但它在某种程度上澄清了事情。我尝试将文件上传到服务器并以相同的方式从那里读取它(http:/young-0/testfile.xml)并且它成功了。然后我尝试从服务器获取“http://www.beijingaqifeed.com” - 但失败了。所以bom是一个红色的鲱鱼,连接被我的提供者阻止(谁说它不是他们)或者网站拒绝来自我的服务器的连接 - 感谢所有帮助过的人。
现在我已经回到了使用推特源,这不太可靠,但确实具有我能够阅读的优势。