我应该使用带有simplexml_load_file和file_get_contents的代理吗?

时间:2018-08-23 01:14:47

标签: php proxy rss simplexml file-get-contents

我正在使用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.

1 个答案:

答案 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。但是,这样做将被视为对其服务的恶意攻击。