Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尝试在URL失败时再次加载URL_Php_Url_Error Handling_Simple Html Dom - Fatal编程技术网

Php 尝试在URL失败时再次加载URL

Php 尝试在URL失败时再次加载URL,php,url,error-handling,simple-html-dom,Php,Url,Error Handling,Simple Html Dom,下面的函数接收表示url的字符串参数,然后将url加载到简单的\u html\u dom对象中。如果加载失败,它将尝试再次加载url public function getSimpleHtmlDomLoaded($url) { $ret = false; $count = 1; $max_attemps = 10; while ($ret === false) { $html = new simple_html_dom(); $re

下面的函数接收表示url的字符串参数,然后将url加载到简单的\u html\u 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 attems
结束后,该函数的下一次调用以及它必须处理的其余url也将继续失败

如果URL暂时脱机,则继续失败是有意义的,但它们不是(我在脚本运行时检查过)

你知道为什么这不能正常工作吗

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

PHP警告:文件\u获取\u内容(http://www.foo.com/resource):失败 打开流:HTTP请求失败!在simple_html_dom.php中联机 1081

这是由这行代码提示的:

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

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

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

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

顺便问一下,您是否尝试创建一个简单的php脚本来测试“SimpleHTMLDOM”解析器是否可以在您的服务器上运行而不会出错?这是我要检查的第一件事


最后,我必须补充一点,在一个案例中,我多次尝试解析一个页面都失败了,我无法赢得屏蔽游戏。最后,我编写了一个脚本,在linux命令行文本浏览器lynx中加载该页面,并将整个页面保存在本地,然后我解析了该本地文件,该文件工作正常

这可能是函数本身的问题

问题是,函数error\u get\u last()也会返回所有私有错误,不知道,这可能取决于PHP版本

我通过将其更改为(检查错误是否更改,而不是是否为null)解决了问题 (或使用非对象函数:file\u get\u html()):


您是否从同一域获取url?也许抓取服务器有一些保护?它们都是从同一个域抓取的,但是如果它有某种保护,那么它不会也无法从浏览器加载URL吗?另外,如果我重新启动脚本,它将再次正常工作。
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;
    }
}