資源描述:
《phpcurl多線程實(shí)現(xiàn)原理與實(shí)例詳解》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、PHPCurl多線程實(shí)現(xiàn)原理與實(shí)例詳解因?yàn)楣ぷ髦形覀兘?jīng)常會(huì)需要使用到Curl多線程來處理一些事情,不得己就深入了對(duì)Curl多線程研究了,下面小編來給各位同學(xué)介紹一下Curl多線程實(shí)例與原理吧.相信許多人對(duì)php手冊(cè)中語焉不詳?shù)腸url_multi一族的函數(shù)頭疼不已,它們文檔少,給的例子更是簡(jiǎn)單的讓你無從借鑒,我也曾經(jīng)找了許多網(wǎng)頁,都沒見一個(gè)完整的應(yīng)用例子。1.curl_multi_add_handle??2.curl_multi_close??3.curl_multi_exec??4.curl_multi_getcontent??5.curl_multi
2、_info_read??6.curl_multi_init??7.curl_multi_remove_handle??8.curl_multi_select?一般來說,想到要用這些函數(shù)時(shí),目的顯然應(yīng)該是要同時(shí)請(qǐng)求多個(gè)url,而不是一個(gè)一個(gè)依次請(qǐng)求,否則不如自己循環(huán)去調(diào)curl_exec好了.步驟總結(jié)如下:第一步:調(diào)用curl_multi_init第二步:循環(huán)調(diào)用curl_multi_add_handle,這一步需要注意的是,curl_multi_add_handle的第二個(gè)參數(shù)是由curl_init而來的子handle。第三步:持續(xù)調(diào)用curl_mult
3、i_exec第四步:根據(jù)需要循環(huán)調(diào)用curl_multi_getcontent獲取結(jié)果第五步:調(diào)用curl_multi_remove_handle,并為每個(gè)字handle調(diào)用curl_close第六步:調(diào)用curl_multi_close?這里有PHP手冊(cè)上的例子,代碼如下:1.
4、p.net/");??2.curl_setopt($ch1,?CURLOPT_HEADER,?0);??3.curl_setopt($ch2,?CURLOPT_URL,?"http://www.php.net/");??4.curl_setopt($ch2,?CURLOPT_HEADER,?0);??5.???6.//?創(chuàng)建批處理cURL句柄??7.$mh?=?curl_multi_init();??8.???9.//?增加2個(gè)句柄??10.curl_multi_add_handle($mh,$ch1);??11.curl_multi_add_handl
5、e($mh,$ch2);??12.???13.$active?=?null;??14.//?執(zhí)行批處理句柄??15.do?{??16.????$mrc?=?curl_multi_exec($mh,?$active);??17.}?while?($mrc?==?CURLM_CALL_MULTI_PERFORM);??18.???19.while?($active?&&?$mrc?==?CURLM_OK)?{??20.????if?(curl_multi_select($mh)?!=?-1)?{??21.????????do?{??22.??????????
6、??$mrc?=?curl_multi_exec($mh,?$active);??23.????????}?while?($mrc?==?CURLM_CALL_MULTI_PERFORM);??24.????}??25.}??26.//?關(guān)閉全部句柄??27.curl_multi_remove_handle($mh,?$ch1);??28.curl_multi_remove_handle($mh,?$ch2);??29.curl_multi_close($mh);??30.?>?整個(gè)使用過程差不多就是這樣,但是,這個(gè)簡(jiǎn)單代碼有個(gè)致命弱點(diǎn),就是在do循環(huán)的
7、那段,在整個(gè)url請(qǐng)求期間是個(gè)死循環(huán),它會(huì)輕易導(dǎo)致CPU占用100%。現(xiàn)在我們來改進(jìn)它,這里要用到一個(gè)幾乎沒有任何文檔的函數(shù)curl_multi_select了,雖然C的curl庫對(duì)select有說明,但是,php里的接口和用法確與C中有不同。把上面do的那段改成下面這樣,實(shí)例代碼如下:1.do?{??1.????????????????????????$mrc?=?curl_multi_exec($mh,$active);??2.?????????????????}?while?($mrc?==?CURLM_CALL_MULTI_PERFORM);??
8、3.????????????????while?($active?and?$mr