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条评论