今天在利用curl_multi函數來獲取一些外網內容時發現只要一運行curl_multi函數我的cpu就占得非常的高,后來看一站長分享了此問題解決方法我也整理一下與各位分享一下,希望對大家有幫助.
簡單的cURL處理如下,代碼如下:
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, 'http://m.survivalescaperooms.com');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- $con = curl_exec($ch);
- curl_close($ch);
cURL還提供了批量處理會話,下面是cURL批量處理相關函數:
curl_multi_init — 返回一個新cURL批處理句柄
curl_multi_add_handle — 向curl批處理會話中添加單獨的curl句柄
curl_multi_exec — 解析一個cURL批處理句柄
curl_multi_getcontent — 如果設置了CURLOPT_RETURNTRANSFER,則返回獲取的輸出的文本流
curl_multi_select — 等待所有cURL批處理中的活動連接
curl_multi_info_read — 獲取當前解析的cURL的相關傳輸信息
curl_multi_remove_handle — 移除curl批處理句柄資源中的某個句柄資源
curl_multi_close — 關閉一組cURL句柄
看下面使用curl multi批處理的例子,代碼如下:
- /**
- * cURL multi批量處理
- *
- * @author mckee
- * @link http://m.survivalescaperooms.com
- *
- */
- $url_array = array(
- 'http://www.Vevb.net/',
- 'http://www.Vevb.net/php/627.html',
- 'http://www.Vevb.net/php/258.html'
- );
- $handles = $contents = array();
- //初始化curl multi對象
- $mh = curl_multi_init();
- //添加curl 批處理會話
- foreach($url_array as $key => $url)
- {
- $handles[$key] = curl_init($url);
- curl_setopt($handles[$key], CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($handles[$key], CURLOPT_TIMEOUT, 10);
- curl_multi_add_handle($mh, $handles[$key]);
- }//開源代碼Vevb.com
- //======================執行批處理句柄=================================
- $active = null;
- 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){
- usleep(100);
- }
- do {
- $mrc = curl_multi_exec($mh, $active);
- } while ($mrc == CURLM_CALL_MULTI_PERFORM);
- }
- //====================================================================
- //獲取批處理內容
- foreach($handles as $i => $ch)
- {
- $content = curl_multi_getcontent($ch);
- $contents[$i] = curl_errno($ch) == 0 ? $content : '';
- }
- //移除批處理句柄
- foreach($handles as $ch)
- {
- curl_multi_remove_handle($mh, $ch);
- }
- //關閉批處理句柄
- curl_multi_close($mh);
- print_r($contents);
上面這段程序重點是執行批處理的那段,普通的處理,代碼如下:
do { $n=curl_multi_exec($mh,$active); } while ($active);
會造成CPU Loading過高,因為$active要等全部url數據接受完畢才變成false,所以這里用到了curl_multi_exec的返回值判斷是否還有數據,當有數據的時候就不停調用curl_multi_exec,沒有執行數據就會sleep,如此就會避免CPU Loading 100%了.
新聞熱點
疑難解答