【问题标题】:Should I use proxies with simplexml_load_file and file_get_contents?我应该使用带有 simplexml_load_file 和 file_get_contents 的代理吗?
【发布时间】:2018-08-23 01:14:46
【问题描述】:

我暂时使用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.

【问题讨论】:

  • 因此,该网站正在使用服务来检测机器人,而您的代码是机器人,因此该服务正在检测您的代码并拒绝其访问。听起来该网站不希望您以这种方式访问​​它,并且正在按预期工作。
  • @IMSoP,这样做是为了防止 DDos 和类似类型的攻击,我只是想阅读 RSS
  • 当然,但您的问题仍然是“我怎样才能绕过这个(身份不明的)站点保护”。如果行为不端,请与网站所有者或保护供应商联系;如果您正在做网站所有者不希望您做的事情,请不要这样做。

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


【解决方案1】:

您依赖http://example.com/feed始终 存在并且始终 准确返回您正在寻找的内容的假设。正如您所发现的,这是一个错误的假设。

您尝试使用 file_get_contents()simplexml_load_file() 访问网络,并发现有时这些调用会失败。您必须始终为这些调用失败做好准备。某些网站是否公开允许这种行为或者您是否拥有非常可靠的虚拟主机并不重要。有些情况是您无法控制的,例如 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。但这样做会被视为对其服务的恶意攻击。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 2018-06-09
    • 2016-09-24
    • 1970-01-01
    • 2019-01-15
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多