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