【问题标题】:fopen not working for some urls?fopen 不适用于某些网址?
【发布时间】:2010-02-13 20:31:47
【问题描述】:

我在阅读某些网址时遇到问题。 url 没有任何问题,因为我可以在浏览器中查看它们(下面给出了一个这样的 URL 的示例):

http://www.bloomberg.com/apps/news?pid=20601087&sid=a2BhXFMpbb5M

我在我的代码中使用这样的 fopen:

public static function grokPage($path)
{
    $data = '';
    $file = fopen($path, "r");

    if ($file)
    {
        while (!feof($file))
            $data .= fgets($file, 1024);
    }
    return $data;
}

我得到的错误是:

警告:fopen(http://www.bloomberg.com/apps/news?pid=20601087&sid=a2BhXFMpbb5M) [0function.fopen0]:打开流失败:达到重定向限制,在 xxx_filename.php 中中止

从 PHP fopen 文档看,我似乎正确地使用了该函数。有谁了解递归警告以及如何解决它?

【问题讨论】:

    标签: php


    【解决方案1】:

    这意味着您的目标页面返回的重定向到不同地址(可能使用Location: 标头)比您的max_redirects 设置指定的更多。

    这看起来像very good article,关于如何使用 fopen 包装器获取网页。它包含一个关于如何更改max_redirects 设置的示例。

    不过,彭博很可能故意将您拒之门外,因为它检测到自动数据抓取,这可能违反了他们的条款和条件。

    【讨论】:

    • 请阅读已发布的使用条款 - 这可能只是一个错误。 IIRC url 包装器不提供有效的用户代理 - 但是您可以在使用 curl 函数时指定一个
    • 谢谢。我终于让它工作了。顺便说一句,我提供的网址只是我正在测试的链接的一个示例。
    【解决方案2】:

    “达到重定向限制”意味着远程站点正在发回 Location 标头,该 Location 被跟踪,然后重定向的位置再次给出 Location 标头。这个过程一直持续到达到一些预定义的重定向数量(位置标头)。

    该网站可能有意将客户端重定向到其他地方,但存在导致循环的错误。

    您应该考虑尝试另一种获取 URL 的方法——一种允许您指定诸如用户代理字符串之类的内容的方法。试试curl,虽然很丑但是效果很好。尝试伪装成 IE6 或 Firefox 而不是 PHP 或 curl。

    编辑:Pekka 的评论包含一个链接,其中包含有关使用 fopen 包装器的信息,包括如何设置用户代理字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多