2014年11月14日 星期五
PHP 使用 CURL 同步抓取多個網頁
一般 CURL 抓網頁的方法, 是一頁一頁抓, 假設要抓 4頁, 所費時間各別是 5,10,7,5 秒, 那全部總合所花的時間就是 5 + 10 + 7 + 5 = 27 秒.
若能同時間去抓取多個網頁, 所花費的時間 5,10,7,5 秒, 全部總合所花的時間是 10 秒.(花費最多時間的秒數)
於 JavaScript 可使用 AJAX 的 async(YAHOO.util.Connect.asyncRequest) 來達成, 於 PHP 可以用 CURL 來達成此 Multi-Threading 的效果.
官方文件: PHP: curl_multi_init
程式(async.php)
View Raw Code?
0) // 每個 connect 要間隔多久
usleep($wait_usec); // 250000 = 0.25 sec
} while ($running > 0);
*/
/* 此做法就可以避免掉 CPU loading 100% 的問題 */
// 參考自: http://www.hengss.com/xueyuan/sort0362/php/info-36963.html
/* 此作法可能會發生無窮迴圈
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active and $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
*/
/*
// 感謝 Ren 指點的作法. (需要在測試一下)
// curl_multi_exec的返回值是用來返回多線程處裡時的錯誤,正常來說返回值是0,也就是說只用$mrc捕捉返回值當成判斷式的迴圈只會運行一次,而真的發生錯誤時,有拿$mrc判斷的都會變死迴圈。
// 而curl_multi_select的功能是curl發送請求後,在有回應前會一直處於等待狀態,所以不需要把它導入空迴圈,它就像是會自己做判斷&自己決定等待時間的sleep()。
*/
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
/* 讀取資料 */
foreach($handle as $i => $ch) {
$content = curl_multi_getcontent($ch);
$data[$i] = (curl_errno($ch) == 0) ? $content : false;
}
/* 移除 handle*/
foreach($handle as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
return $data;
}
?>
使用
View Raw Code?
example1, [1] => example2
?>
測試
sleep.php # 看時間延長取得的效果
View Raw Code?
View Raw Code?
5, [1] => 10, [2] => 7, [3] => 5
?>
http://blog.longwin.com.tw/2009/10/php-multi-thread-curl-2009/
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言