尝试在失败时再次加载URL

时间:2012-09-27 07:35:21

标签: php url error-handling simple-html-dom

以下函数接收表示url的字符串参数,然后将该url加载到simple_html_dom对象中。如果加载失败,它会尝试再次加载URL。

  public function getSimpleHtmlDomLoaded($url)
  {
    $ret = false;
    $count = 1;
    $max_attemps = 10;
    while ($ret === false) {
      $html = new simple_html_dom();
      $ret = $html->load_file($url);
      if ($ret === false) {
        echo "Error loading url: $url\n";
        sleep(5);
        $count++;
        $html->clear();
        unset($html);
        if ($count > $max_attemps) 
          return false;
      }
    }
    return $html;
  }

但是,如果url加载失败一次,它会对当前url失败,并且在max attemps结束后,它也会在下一次调用函数时继续失败,其余的url它必须处理。

如果网址暂时脱机,那么保持失败是有意义的,但它们不是(我在脚本运行时已经检查过)。

为什么这不能正常工作?

我还想指出,当开始无法加载网址时,它只会发出警告(而不是多个),并显示以下消息:

  

PHP警告:file_get_contents(http://www.foo.com/resource):失败   打开流:HTTP请求失败!在simple_html_dom.php上   1081

这行代码提示:

$ret = $html->load_file($url);

2 个答案:

答案 0 :(得分:1)

我已经测试了你的代码,它对我来说非常有效,每次调用该函数时它都会从第一次返回有效结果。

因此,即使您从同一个域加载页面,也可以对页面或服务器进行一些保护。 例如,页面可以查找某些cookie,或者服务器可以查找您的用户代理,如果它将您视为机器人,则无法提供正确的内容。

在解析某些网站时遇到了类似的问题。 对我来说,答案是看看页面/服务器的期望是什么,并让我的代码模拟它。一切,从伪造用户代理到生成cookie等。

顺便说一句,您是否尝试创建一个简单的PHP脚本来测试“简单的html dom”解析器可以在您的服务器上运行而没有错误?这是我要检查的第一件事。

最后,我必须在一个案例中添加,虽然我在多次尝试解析一个页面时失败了,但我无法赢得掩蔽游戏。最后,我创建了一个脚本,在linux命令行文本浏览器lynx中加载该页面并在本地保存整个页面,然后我解析了完美的本地文件。

答案 1 :(得分:0)

可能是 load_file()函数本身的问题。

问题是,函数error_get_last()也返回所有私有的错误,不知道,可能依赖于PHP版本?

我通过将其更改为(解决是否更改错误,而不是错误)来解决问题 (或使用非对象函数: file_get_html()):

function load_file()
{
    $preerror=error_get_last();
    $args = func_get_args();
    $this->load(call_user_func_array('file_get_contents', $args), true);
    // Throw an error if we can't properly load the dom.
    if (($error=error_get_last())!==$preerror) {
        $this->clear();
        return false;
    }
}