curl多请求并发使用

    技术2022-05-13  11

    curl大家一定使用过,但并发使用的情况估计不多。但在某些情况下确实比较有用,比如在同一请求里面调用多个他方接口,传统方法我们需要串行请求接口:

    file_get_contents('http://a.php');//1秒

    file_get_contents('http://b.php');//2秒

    file_get_contents('http://c.php');//2秒

    那在这里耗时为5秒,但运营curl的muti方法,我们只需2秒就可请求完毕,继续处理后面的逻辑.代码如下:

    <?php $connomains = array( //2.php自己去些 "http://localhost/2.php?id=1",//sleep(1)秒 "http://localhost/2.php?id=2",//sleep(2)秒 "http://localhost/2.php?id=5",//sleep(5)秒 ); $mh = curl_multi_init(); foreach ($connomains as $i => $url) { $conn[$i] = curl_init($url);//初始化各个子连接 curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);//不直接输出到浏览器 curl_multi_add_handle ($mh,$conn[$i]);//加入多处理句柄 } $active = 0;//连接数 do { do{ //这里$active会被改写成当前未处理数 //全部处理成功$active会变成0 $mrc = curl_multi_exec($mh, $active); //这个循环的目的是尽可能的读写,直到无法继续读写为止(返回CURLM_OK) //返回(CURLM_CALL_MULTI_PERFORM)就表示还能继续向网络读写 }while($mrc==CURLM_CALL_MULTI_PERFORM); //如果一切正常,那么我们要做一个轮询,每隔一定时间(默认是1秒)重新请求一次 //这就是curl_multi_select的作用,它在等待过程中,如果有就返回目前可以读写的句柄数量,以便 //继续读写操作,0则没有可以读写的句柄(完成了) } while ($mrc==CURLM_OK&& $active &&curl_multi_select($mh)!=-1);//直到出错或者全部读写完毕 if ($mrc != CURLM_OK) { print "Curl multi read error $mrc/n"; } // retrieve data foreach ($connomains as $i => $url) { if (($err = curl_error($conn[$i])) == '') { $res[$i]=curl_multi_getcontent($conn[$i]); } else { print "Curl error on handle $i: $err/n"; } curl_multi_remove_handle($mh,$conn[$i]); curl_close($conn[$i]); } curl_multi_close($mh); print_r($res); ?>

     

    有的人为了省事,这样写:

    do { curl_multi_exec($mh,$active); } while ($active);

    看似也能得到结果,但其实很不严谨,并且很浪费cpu,因为这个循环会一直在不停的调用,直到所有链接处理完毕,在循环里面加个print 'a' 就可看出效果了。


    最新回复(0)