/**
 * 使用cURL发送POST请求
 * @param string $url 请求地址
 * @param array $post POST数据数组
 * @param array $options HTTP选项数组
 * @param string $error 用于返回错误信息
 * @param int $errno 用于返回错误码
 * @param string $httpCode 用于返回响应的HTTP状态码
 * @param array $outHeaders 用于获得返回的HTTP头
 * @return mixed 成功返回请求返回结果,失败返回flase
 */
function curl_post($url, $post = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, $isupload = false, &$outHeaders = false)
{
    $heads = array();
    $defaults = [
        CURLOPT_POST			=> 1,
        CURLOPT_URL				=> $url,
        CURLOPT_RETURNTRANSFER	=> 1,
        CURLOPT_CONNECTTIMEOUT	=> 5,
        CURLOPT_TIMEOUT			=> 10,
        CURLOPT_POSTFIELDS		=> ($isupload || is_string($post)) ? $post : http_build_query($post),
    ];
    if ($isupload) {
        $defaults[CURLOPT_SAFE_UPLOAD] = true;
    }
    if (is_array($outHeaders)) {
        $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
            if(!empty(rtrim($v))) {
                list($field, $value) = explode(':', $v, 2);
                if ($field && $value) {
                    $outHeaders[strtolower($field)] = trim($value);
                }
            }
            return strlen($v);
        };
    }
    $ch = curl_init();
    $result = '';
    if ($ch) {
        foreach ($options as $k=>$v) {
            $defaults[$k] = $v;
        }
        curl_setopt_array($ch, $defaults);
        $result = curl_exec($ch);
        if ($result === false) {
            if ($error !== false) {
                $error = curl_error($ch);
            }
            if ($errno !== false) {
                $errno = curl_errno($ch);
            }
        }
        if ($httpCode !== false) {
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        }
        curl_close($ch);
    }
    return $result;
}

/**
 * 使用cURL发送GET请求
 * @param string $url 请求地址
 * @param array $post GET数据数组
 * @param array $options HTTP选项数组
 * @param string $error 用于返回错误信息
 * @param int $errno 用于返回错误码
 * @param string $httpCode 用于返回响应的HTTP状态码
 * @param array $outHeaders 用于获得返回的HTTP头
 * @return mixed 成功返回请求返回结果,失败返回flase
 */
function curl_get($url, $get = [], $options = [], &$error = false, &$errno = false, &$httpCode = false, &$outHeaders = false)
{
    $defaults = [
        CURLOPT_URL				=> $url. (strpos($url, '?') === FALSE ? '?' : '&'). http_build_query($get),
        CURLOPT_HEADER			=> 0,
        CURLOPT_RETURNTRANSFER	=> TRUE,
        CURLOPT_CONNECTTIMEOUT	=> 5,
        CURLOPT_TIMEOUT			=> 10,
    ];
    if (is_array($outHeaders)) {
        $defaults[CURLOPT_HEADERFUNCTION] = function ($c, $v) use(&$outHeaders) {
            if (!empty(rtrim($v))) {
                list($field, $value) = explode(':', $v, 2);
                if ($field && $value) {
                    $outHeaders[strtolower($field)] = trim($value);
                }
            }
            return strlen($v);
        };
    }
    $ch = curl_init();
    $result = '';
    if ($ch) {
        foreach ($options as $k=>$v) {
            $defaults[$k] = $v;
        }
        curl_setopt_array($ch, $defaults);
        $result = curl_exec($ch);
        if ($result === false) {
            if ($error !== false) {
                $error = curl_error($ch);
            }
            if ($errno !== false) {
                $errno = curl_errno($ch);
            }
        }
        if ($httpCode !== false) {
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        }
        curl_close($ch);
    }
    return $result;
}