我正在使用simplexml_load_file
一段时间从多个网站获取RSS。
有时候我从其中一些网站中收到错误消息,并且大约5天后,我在2个特定网站中出现了错误消息。
这是simplexml_load_file
中的错误:
PHP Warning: simplexml_load_file(http://example.com/feed): failed to open stream: Connection timed out
PHP Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://example.com/feed"
这是file_get_contents
中的错误:
PHP Warning: file_get_contents(http://example.com/page): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
这就是我使用simplexml_load_file
的方式:
simplexml_load_file( $url );
这就是我使用file_get_contents
的方式:
file_get_contents( $url );
那是因为我没有使用代理或无效的参数吗?
更新: 这两个网站正在使用防火墙或服务等工具来检查机器人:
Accessing http://example.com/feed securely…
This is an automatic process. Your browser will redirect to your requested content in 5 seconds.
答案 0 :(得分:0)
您所基于的假设是,http://example.com/feed
将会一直存在并且始终会完全返回您要查找的内容。您已经发现,这是一个错误的假设。
您正尝试使用file_get_contents()
和simplexml_load_file()
访问网络,并发现有时这些呼叫失败。您必须始终计划这些呼叫失败。某些网站是否公开允许这种行为或您是否拥有非常可靠的Web主机都没有关系。在某些情况下,您无法控制,例如Internet主干网中断,最终将导致您的应用程序获得不良响应。在您的情况下,第三方已阻止您。这是网络请求发生的故障之一。
首先要解决的是,您必须更好地处理故障。您无法使用file_get_contents()
来执行此操作,因为file_get_contents()
旨在获取文件的内容。在我看来,允许它进行网络调用的PHP实现者犯了一个非常严重的错误,即允许它执行此功能。我建议使用curl:
function doRequest($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if () {
return $output;
} else {
throw new Exception('Sorry, an error occurred');
}
}
使用此方法,您将能够为自己的用户更好地处理错误(发生 )。
您的第二个问题是此特定主机给您403错误。这可能是有意的目的。我认为这是他们告诉您,他们不希望您使用这样的网站。但是,您将需要特别吸引他们,并询问他们可以做什么。他们可能会要求您使用真实的API,他们可能会完全忽略您,甚至可能告诉您要砸沙子-但我们在这里没有任何建议可做。这完全是他们软件的问题(或功能),您必须直接与他们联系以寻求建议。
您可能会使用多个IP地址连接到网站,并在每次被阻止时轮换IP。但是,这样做将被视为对其服务的恶意攻击。