詳解PHP中curl_multi并發(fā)的實現(xiàn)
PHP中的curl_multi系列函數(shù)可以實現(xiàn)同時請求多個URL來實現(xiàn)并發(fā),而不是像普通curl函數(shù)那樣請求后會阻塞,直到結果返回才進行下一個請求。因此在批量請求URL時可通過curl_multi系列函數(shù)提升程序的運行效率。
curl普通請求
$startTime = microtime(true); $chArr = []; $optArr = [ CURLOPT_URL => 'http://www.httpbin.org/ip', CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, ]; $result = []; //創(chuàng)建多個curl資源并執(zhí)行 for ($i=0; $i<10; $i++) { $chArr[$i] = curl_init(); curl_setopt_array($chArr[$i], $optArr); $result[$i] = curl_exec($chArr[$i]); curl_close($chArr[$i]); } $endTime = microtime(true); echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);
use time: 6.080 s
curl_multi并發(fā)請求
$startTime = microtime(true); $chArr = []; $optArr = [ CURLOPT_URL => 'http://www.httpbin.org/ip', CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, ]; $result = []; //創(chuàng)建多個curl資源 for ($i=0; $i<10; $i++) { $chArr[$i] = curl_init(); curl_setopt_array($chArr[$i], $optArr); } //創(chuàng)建批處理curl句柄 $mh = curl_multi_init(); //將單個curl句柄添加到批處理curl句柄中 foreach ($chArr as $ch) { curl_multi_add_handle($mh, $ch); } //判斷操作是否仍在執(zhí)行的標識的引用 $active = null; /** * 本次循環(huán)第一次處理 $mh 批處理中的 $ch 句柄,并將 $mh 批處理的執(zhí)行狀態(tài)寫入 $active, * 當狀態(tài)值等于 CURLM_CALL_MULTI_PERFORM 時,表明數(shù)據(jù)還在寫入或讀取中,執(zhí)行循環(huán), * 當?shù)谝淮?$ch 句柄的數(shù)據(jù)寫入或讀取成功后,狀態(tài)值變?yōu)?CURLM_OK ,跳出本次循環(huán),進入下面的大循環(huán)中。 */ do { //處理在批處理棧中的每一個句柄 $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); /** * 上面這段代碼中,是可以直接使用 $active > 0 來作為 while 的條件,如下: * do { * $mrc = curl_multi_exec($mh, $active); * } while ($active > 0); * 此時如果整個批處理句柄沒有全部執(zhí)行完畢時,系統(tǒng)會不停的執(zhí)行 curl_multi_exec 函數(shù),從而導致系統(tǒng)CPU占用會很高, * 因此一般不采用這種方案,可以通過 curl_multi_select 函數(shù)來達到?jīng)]有需要讀取的程序就阻塞住的目的。 */ /** * $active 為 true 時,即 $mh 批處理之中還有 $ch 句柄等待處理, * $mrc == CURLM_OK,即上一次 $ch 句柄的讀取或?qū)懭胍呀?jīng)執(zhí)行完畢。 */ while ($active && $mrc == CURLM_OK) { /** * 程序進入阻塞狀態(tài),直到批處理中有活動連接(即 $mh 批處理中還有可執(zhí)行的 $ch 句柄), * 這樣執(zhí)行的好處是 $mh 批處理中的 $ch 句柄會在讀取或?qū)懭霐?shù)據(jù)結束后($mrc == CURLM_OK)進入阻塞階段, * 而不會在整個 $mh 批處理執(zhí)行時不停地執(zhí)行 curl_multi_exec 函數(shù),白白浪費CPU資源。 */ if (curl_multi_select($mh) != -1) { //程序退出阻塞狀態(tài)繼續(xù)執(zhí)行需要處理的 $ch 句柄 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ($chArr as $i=>$ch) { //獲取某個curl句柄的返回值 $result[$i] = curl_multi_getcontent($ch); //移除批處理句柄中的某個句柄資源 curl_multi_remove_handle($mh, $ch); } //關閉一組curl句柄 curl_multi_close($mh); $endTime = microtime(true); echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);
use time: 0.599 s
通過對比上述程序的運行時間可以得知,使用curl_multi系列函數(shù)并發(fā)請求要比普通的curl函數(shù)依次請求效率高很多。
到此這篇關于詳解PHP中curl_multi并發(fā)的實現(xiàn)的文章就介紹到這了,更多相關PHP curl_multi并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Laravel 實現(xiàn)在Blade模版中使用全局變量代替路徑的例子
今天小編就為大家分享一篇Laravel 實現(xiàn)在Blade模版中使用全局變量代替路徑的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10php中計算未知長度的字符串哪個字符出現(xiàn)的次數(shù)最多的代碼
php中計算未知長度的字符串哪個字符出現(xiàn)的次數(shù)最多的代碼,需要的朋友可以參考下2012-08-08php安裝xdebug/php安裝pear/phpunit詳解步驟(圖)
PHP環(huán)境中安裝pear、phpunit以及xdebug全攻略,大家參考使用吧2013-12-12