Curl多線程及原理


class ManyCurl {

//異步加載多個url請求

//用例:

//? ? ? $url_array = array(

//? ? ? ? ? 'http://example.com/sleep.php?time=5',

//? ? ? ? ? 'http://example.com/sleep.php?time=10',

//? ? ? ? ? 'http://example.com/sleep.php?time=7',

//? ? ? ? ? 'http://example.com/sleep.php?time=5',

//? ? ? ? );

//? ??

public function async_get_url($url_array, $wait_usec = 0) {

if (!is_array($url_array))

return false;

$wait_usec = intval($wait_usec);

$data? ? = array();

$handle? = array();

$running = 0;

$mh = curl_multi_init(); // multi curl handler

$i = 0;

foreach($url_array as $url) {

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 獲取頁面內(nèi)容,不直接輸出到頁面

curl_setopt($ch, CURLOPT_TIMEOUT, 30);//超時時間

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');//在HTTP請求中包含一個”user-agent”頭的字符串曾沈。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect

curl_setopt($ch, CURLOPT_MAXREDIRS, 7);//以限定遞歸返回的數(shù)量

curl_multi_add_handle($mh, $ch); // 把 curl resource 放進 multi curl handler 裡

//作用是向curl批處理會話中添加單獨的curl句柄資源。curl_multi_add_handle()函數(shù)有兩個參數(shù),第一個參數(shù)表示一個curl批處理句柄資源兴垦,第二個參數(shù)表示一個單獨的curl句柄資源日矫。

$handle[$i++] = $ch;

}

/* 執(zhí)行 */

/* 此種做法會造成 CPU loading 過重 (CPU 100%)

do {

curl_multi_exec($mh, $running);

if ($wait_usec > 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);//CURLM_CALL_MULTI_PERFORM=-1

while ($active and $mrc == CURLM_OK) {//CURLM_OK=0

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);//CURLM_CALL_MULTI_PERFORM=-1

}

}

/*因為$active要等全部url數(shù)據(jù)接受完畢才變成false茵汰,所以這里用到了curl_multi_exec的返回值判斷是否還有數(shù)據(jù)枢里,當有數(shù)據(jù)的時候就不停調(diào)用、//curl_multi_exec蹂午,暫時沒有數(shù)據(jù)就進入select階段栏豺,新數(shù)據(jù)一來就可以被喚醒繼續(xù)執(zhí)行。這里的好處就是CPU的無謂消耗沒有了画侣。

// curl_multi_exec的返回值是用來返回多線程處裡時的錯誤冰悠,正常來說返回值是0堡妒,也就是說只用$mrc捕捉返回值當成判斷式的迴圈只會運行一次配乱,而真的發(fā)生錯誤時,有拿$mrc判斷的都會變死迴圈皮迟。

// 而curl_multi_select的功能是curl發(fā)送請求後搬泥,在有回應(yīng)前會一直處於等待狀態(tài),所以不需要把它導入空迴圈伏尼,它就像是會自己做判斷&自己決定等待時間的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;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爆阶,隨后出現(xiàn)的幾起案子燥透,更是在濱河造成了極大的恐慌,老刑警劉巖辨图,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班套,死亡現(xiàn)場離奇詭異,居然都是意外死亡故河,警方通過查閱死者的電腦和手機吱韭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鱼的,“玉大人理盆,你說我怎么就攤上這事痘煤。” “怎么了猿规?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵衷快,是天一觀的道長。 經(jīng)常有香客問我姨俩,道長烦磁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任哼勇,我火速辦了婚禮都伪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘积担。我一直安慰自己陨晶,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布帝璧。 她就那樣靜靜地躺著先誉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪的烁。 梳的紋絲不亂的頭發(fā)上褐耳,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音渴庆,去河邊找鬼铃芦。 笑死,一個胖子當著我的面吹牛襟雷,可吹牛的內(nèi)容都是我干的刃滓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼耸弄,長吁一口氣:“原來是場噩夢啊……” “哼咧虎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起计呈,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤砰诵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捌显,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茁彭,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年苇瓣,在試婚紗的時候發(fā)現(xiàn)自己被綠了尉间。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哲嘲,靈堂內(nèi)的尸體忽然破棺而出贪薪,到底是詐尸還是另有隱情,我是刑警寧澤眠副,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布画切,位于F島的核電站,受9級特大地震影響囱怕,放射性物質(zhì)發(fā)生泄漏霍弹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一娃弓、第九天 我趴在偏房一處隱蔽的房頂上張望典格。 院中可真熱鬧,春花似錦台丛、人聲如沸耍缴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽防嗡。三九已至,卻和暖如春侠坎,著一層夾襖步出監(jiān)牢的瞬間蚁趁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工实胸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留他嫡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓童芹,卻偏偏與公主長得像涮瞻,于是被迫代替她去往敵國和親鲤拿。 傳聞我的和親對象是個殘疾皇子假褪,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容