search

Home  >  Q&A  >  body text

php - 如何处理simple_html_dom load_file 超时的问题?

我用simple_html_dom 爬取网页,用的面向对象方式,但是会出现超时的情况。

set_time_limit(10000);
ini_set('default_socket_timeout', 5);

$context = stream_context_create(
    array(
        'http'=>array(
            'method' => 'GET', 
            'timeout' => 5
        ),
    )
);
$shd->load_file($player_url, false, $contex);

我用上面的代码做限时处理,可是不起作用。当时间超过10000秒时会退出脚本,但是我希望一条请求超时后会终止这条请求,然后重新发起请求或进行下一条请求。大神有好的办法么?

PHPzPHPz2902 days ago454

reply all(2)I'll reply

  • ringa_lee

    ringa_lee2017-04-10 16:31:10

    不要直接使用它提供的接口获取网络上的内容,虽然它具备这个能力,但这也只是给你调试的时候使用的。在真实情况下很容易碰到如你问题中所述的超时情况,所以你最好先用curl接口来获取内容,然后再用simple_html_dom 来处理这个内容,前者可以很方便地处理各种网络错误

    function get_html_by_url($url, $timeout = 5) {
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
        // 自动识别301跳转
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        
        // 设置各种超时限制
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        
        $html = curl_exec($ch);
        
        // 处理各种错误
        if (false === $html) {
            return false;
        }
        
        // 处理http错误
        if (200 != curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
            return false;
        }
        
        return $html;
    }
    
    // 直接使用
    $html = get_html_by_url('http://www.sina.com.cn', 5);
    
    // 用simple_html_dom加载
    if (false !== $html) {
        $shd->load($html);
    }

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:31:10

    配合set_time_limit(0);,必要时,适当增大default_socket_timeout

    reply
    0
  • Cancelreply