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

发表评论