if (!function_exists('async_http')) { /** * 优化版多线程请求 * * @param [type] $url_array * @param boolean $is_json * @param integer $wait_usec * @return array * @author 617 <email:723875993@qq.com> */ function async_http($url_array, $all_info = false, $key = '', $is_json = true, $wait_usec = 250000) { if (!is_array($url_array)) return false; $wait_usec = intval($wait_usec); $handle = array(); $active = 0; $mh = curl_multi_init(); $index = 0; $i = 0; $map = array(); foreach ($url_array as $url) { $ch = curl_init(); if (isset($url['params'])) { $params = $is_json ? json_encode($url['params'], 1) : http_build_query($url['params']); //判断是否传输文件 curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_URL, $url['url']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里 $index = $i++; $handle[$index] = $ch; if (isset($url['params'])) { if ($key && isset($url['params'][$key])) { $map[(string) $ch] = $url['params'][$key]; } else { $map[(string) $ch] = $url['url'] . '[cut]' . http_build_query($url['params']); } } else { $map[(string) $ch] = $url['url']; } } do { while (($mrc = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM); if ($mrc != CURLM_OK) { break; } while ($done = curl_multi_info_read($mh)) { if ($all_info) { $info = curl_getinfo($done['handle']); $error = curl_error($done['handle']); $results = curl_multi_getcontent($done['handle']); $responses[$map[(string) $done['handle']]] = compact('info', 'error', 'results'); } else { $responses[] = curl_multi_getcontent($done['handle']); } curl_multi_remove_handle($mh, $done['handle']); curl_close($done['handle']); } if ($active > 0) { curl_multi_select($mh); } } while ($active); curl_multi_close($mh); return $responses; } }