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; $http_code = curl_getinfo($handle[$k],CURLINFO_HTTP_CODE); //获取http错误码 $curl_error = curl_error($handle[$k]); //获取curl错误码 //移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。 curl_multi_remove_handle($mh,$handle[$k]); } curl_multi_close($mh); } } return $result;}