详解PHP中curl_multi并发的实现
PHP中的curl_multi系列函数可以实现同时请求多个URL来实现并发,而不是像普通curl函数那样请求后会阻塞,直到结果返回才进行下一个请求。因此在批量请求URL时可通过curl_multi系列函数提升程序的运行效率。
curl普通请求
$startTime=microtime(true); $chArr=[]; $optArr=[ CURLOPT_URL=>'http://www.httpbin.org/ip', CURLOPT_HEADER=>0, CURLOPT_RETURNTRANSFER=>1, ]; $result=[]; //创建多个curl资源并执行 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); echosprintf("usetime:%.3fs".PHP_EOL,$endTime-$startTime);
usetime:6.080s
curl_multi并发请求
$startTime=microtime(true); $chArr=[]; $optArr=[ CURLOPT_URL=>'http://www.httpbin.org/ip', CURLOPT_HEADER=>0, CURLOPT_RETURNTRANSFER=>1, ]; $result=[]; //创建多个curl资源 for($i=0;$i<10;$i++){ $chArr[$i]=curl_init(); curl_setopt_array($chArr[$i],$optArr); } //创建批处理curl句柄 $mh=curl_multi_init(); //将单个curl句柄添加到批处理curl句柄中 foreach($chArras$ch){ curl_multi_add_handle($mh,$ch); } //判断操作是否仍在执行的标识的引用 $active=null; /** *本次循环第一次处理$mh批处理中的$ch句柄,并将$mh批处理的执行状态写入$active, *当状态值等于CURLM_CALL_MULTI_PERFORM时,表明数据还在写入或读取中,执行循环, *当第一次$ch句柄的数据写入或读取成功后,状态值变为CURLM_OK,跳出本次循环,进入下面的大循环中。 */ 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); *此时如果整个批处理句柄没有全部执行完毕时,系统会不停的执行curl_multi_exec函数,从而导致系统CPU占用会很高, *因此一般不采用这种方案,可以通过curl_multi_select函数来达到没有需要读取的程序就阻塞住的目的。 */ /** *$active为true时,即$mh批处理之中还有$ch句柄等待处理, *$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。 */ while($active&&$mrc==CURLM_OK){ /** *程序进入阻塞状态,直到批处理中有活动连接(即$mh批处理中还有可执行的$ch句柄), *这样执行的好处是$mh批处理中的$ch句柄会在读取或写入数据结束后($mrc==CURLM_OK)进入阻塞阶段, *而不会在整个$mh批处理执行时不停地执行curl_multi_exec函数,白白浪费CPU资源。 */ if(curl_multi_select($mh)!=-1){ //程序退出阻塞状态继续执行需要处理的$ch句柄 do{ $mrc=curl_multi_exec($mh,$active); }while($mrc==CURLM_CALL_MULTI_PERFORM); } } foreach($chArras$i=>$ch){ //获取某个curl句柄的返回值 $result[$i]=curl_multi_getcontent($ch); //移除批处理句柄中的某个句柄资源 curl_multi_remove_handle($mh,$ch); } //关闭一组curl句柄 curl_multi_close($mh); $endTime=microtime(true); echosprintf("usetime:%.3fs".PHP_EOL,$endTime-$startTime);
usetime:0.599s
通过对比上述程序的运行时间可以得知,使用curl_multi系列函数并发请求要比普通的curl函数依次请求效率高很多。
到此这篇关于详解PHP中curl_multi并发的实现的文章就介绍到这了,更多相关PHPcurl_multi并发内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。