Home >Backend Development >PHP Tutorial >如何处理simple_html_dom load_file 超时的问题?

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

WBOY
WBOYOriginal
2016-06-06 20:22:371307browse

我用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

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn