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;
    }
}