curl批处理实现,多请求并发
curl批处理实现,多请求并发,提高请求速度
最近在完成一个项目,需要推送模板消息,由于单个单个发,速度非常慢,效率也非常低,所以百度了一下,发现curl_multi_init 可以同时请求多个地址,所以就将普通的curl改成curl_multi_init,再搭配上swoole,发送速度跟效率大大提升,可以达到10分钟推送3万份模板消息,今天跟大家分享curl_multi_init使用方法。
一、关于curl_multi_init()
一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了。不过,在使用curl_multi的时候,你可能遇到cpu消耗过高、网页假死等现象
二、使用curl_multi的步骤总结如下
第一步:调用curl_multi_init
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用curl_multi_close
三、各函数作用解释
curl_multi_init()
初始化一个curl批处理句柄资源。
curl_multi_add_handle()
向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_exec()
解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。
curl_multi_remove_handle()
移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_close()
关闭一个批处理句柄资源。
curl_multi_getcontent()
在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。
curl_multi_info_read()
获取当前解析的curl的相关传输信息。
四、实例代码
下面是博主的实例代码,防止假死以及奔溃,博主这是POST请求方式的,大家可以参考下:
/** * 并发请求发送模板消息【curl_multi_init方式发送】 * @param $paramsList【数据数组】 * @param $paramsListCount【本次请求数量】 * @param $token */ function runPost($paramsList, $paramsListCount, $token) { $chArr = []; for ($i = 0; $i < $paramsListCount - 1; $i++) { $paramsString = json_encode($paramsList[$i]); $chArr[$i] = curl_init("https://api.q.qq.com/api/json/template/send?access_token=" . $token); curl_setopt($chArr[$i], CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($chArr[$i], CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($chArr[$i], CURLOPT_HEADER, FALSE); curl_setopt($chArr[$i], CURLOPT_RETURNTRANSFER, TRUE); // post数据 curl_setopt($chArr[$i], CURLOPT_POST, 1); // post的变量 curl_setopt($chArr[$i], CURLOPT_POSTFIELDS, $paramsString); curl_setopt($chArr[$i], CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=utf-8', 'Content-Length: ' . strlen($paramsString)) ); } $mh = curl_multi_init(); foreach ($chArr as $k => $ch) curl_multi_add_handle($mh, $ch); $running = null; do { $mrc = curl_multi_exec($mh, $running); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($running && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $running); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ($chArr as $k => $ch) { $result[$k] = curl_multi_getcontent($ch); curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); }
以下是调用请求的方法,该参数需要我们传入发送数组以及发送数据,代码如下:
$paramsList=array( 1=>array('data'=>123), 2=>array('data'=>123), 3=>array('data'=>123), 4=>array('data'=>123), 5=>array('data'=>123) ); $paramsListCount = count($paramsList); $token =""; runPost($paramsList, $paramsListCount, $token)
这样我们便可以实现同时请求多个请求,这样速度跟效率会大大的提升。
0条评论