当前位置:Gxlcms > PHP教程 > 如何处理simple_html_domload_file超时的问题?

如何处理simple_html_domload_file超时的问题?

时间:2021-07-01 10:21:17 帮助过:5人阅读

我用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秒时会退出脚本,但是我希望一条请求超时后会终止这条请求,然后重新发起请求或进行下一条请求。大神有好的办法么?

回复内容:

我用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秒时会退出脚本,但是我希望一条请求超时后会终止这条请求,然后重新发起请求或进行下一条请求。大神有好的办法么?

不要直接使用它提供的接口获取网络上的内容,虽然它具备这个能力,但这也只是给你调试的时候使用的。在真实情况下很容易碰到如你问题中所述的超时情况,所以你最好先用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);
}

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

人气教程排行