>백엔드 개발 >PHP 튜토리얼 >如何处理simple_html_dom load_file 超时的问题?

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

WBOY
WBOY원래의
2016-06-06 20:22:371307검색

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

<code>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);

</code>

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

回复内容:

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

<code>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);

</code>

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

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

<code class="php">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);
}</code>

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.