curl实现多路并发请求(请求数量大时再次分割实现循环处理)

Posted quepq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了curl实现多路并发请求(请求数量大时再次分割实现循环处理)相关的知识,希望对你有一定的参考价值。

function multiple_threads_request($data,$url,$chuck_num=20,$wait_usec = 0){
    $result = [];
    if (empty($data) || empty($url)) {
        $send_data = array_chunk($data, $chuck_num,true);
        foreach ($send_data as $son_data){
            $mh = curl_multi_init(); //初始化一个curl批处理句柄资源
            $handle = [];
            foreach ($son_data as $k=>$val)
            {
                $curl_array[$k] = curl_init($url);
                curl_setopt($handle[$k], CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($handle[$k], CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($handle[$k], CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($handle[$k], CURLOPT_POST, 1);
                curl_setopt($handle[$k], CURLOPT_TIMEOUT,10);
                curl_setopt($handle[$k], CURLOPT_HEADER, 0);
                curl_setopt($handle[$k], CURLOPT_POSTFIELDS,$val);
                //向curl批处理句柄资源中添加单独的curl句柄资源。curl_multi_add_handle函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源
                curl_multi_add_handle($mh, $handle[$k]);
            }
            $running = 0;
            do {
                //解析一个curl批处理句柄,curl_multi_exec函数有两个参数,第一个表示一个批处理句柄资源,第二个参数是一个应用值参数,表示剩余需要处理的单个的curl句柄资源。
                curl_multi_exec($mh, $running);//持续调用curl_multi_exec
                if ($wait_usec > 0) /* 每个 connect 要间隔多久 */
                    usleep($wait_usec); // 250000 = 0.25 sec
            } while ($running > 0);

            foreach ($son_data as $k=>$val)
            {
                $return = curl_multi_getcontent($handle[$k]);//根据需要循环调用curl_multi_getcontent
                $return[$k] = (curl_errno($handle[$k]) == 0) ? $return : false;
                //移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
                curl_multi_remove_handle($mh,$handle[$k]);
            }
            curl_multi_close($mh);
        }
    }

    return $result;
}

 

以上是关于curl实现多路并发请求(请求数量大时再次分割实现循环处理)的主要内容,如果未能解决你的问题,请参考以下文章

IO多路复用/基于IO多路复用+socket实现并发请求/协程

用PHP的curl实现并发请求远程文件(抓取远程网页)

PHP中curl_multi并发详解

39.IO多路复用(用select实现伪并发)

PHP CURL - 错误的请求发布 - 当 POSTFIELDS 非常大时

高并发计算服务器数量