| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | <?phpnamespace fast;/** * Http 请求类 */class Http{    /**     * 发送一个POST请求     * @param string $url     请求URL     * @param array  $params  请求参数     * @param array  $options 扩展参数     * @return mixed|string     */    public static function post($url, $params = [], $options = [])    {        $req = self::sendRequest($url, $params, 'POST', $options);        return $req['ret'] ? $req['msg'] : '';    }    /**     * 发送一个GET请求     * @param string $url     请求URL     * @param array  $params  请求参数     * @param array  $options 扩展参数     * @return mixed|string     */    public static function get($url, $params = [], $options = [])    {        $req = self::sendRequest($url, $params, 'GET', $options);        return $req['ret'] ? $req['msg'] : '';    }    /**     * CURL发送Request请求,含POST和REQUEST     * @param string $url     请求的链接     * @param mixed  $params  传递的参数     * @param string $method  请求的方法     * @param mixed  $options CURL的参数     * @return array     */    public static function sendRequest($url, $params = [], $method = 'POST', $options = [])    {        $method = strtoupper($method);        $protocol = substr($url, 0, 5);        $query_string = is_array($params) ? http_build_query($params) : $params;        $ch = curl_init();        $defaults = [];        if ('GET' == $method) {            $geturl = $query_string ? $url . (stripos($url, "?") !== false ? "&" : "?") . $query_string : $url;            $defaults[CURLOPT_URL] = $geturl;        } else {            $defaults[CURLOPT_URL] = $url;            if ($method == 'POST') {                $defaults[CURLOPT_POST] = 1;            } else {                $defaults[CURLOPT_CUSTOMREQUEST] = $method;            }            $defaults[CURLOPT_POSTFIELDS] = $params;        }        $defaults[CURLOPT_HEADER] = false;        $defaults[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36";        $defaults[CURLOPT_FOLLOWLOCATION] = true;        $defaults[CURLOPT_RETURNTRANSFER] = true;        $defaults[CURLOPT_CONNECTTIMEOUT] = 3;        $defaults[CURLOPT_TIMEOUT] = 3;        // disable 100-continue        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));        if ('https' == $protocol) {            $defaults[CURLOPT_SSL_VERIFYPEER] = false;            $defaults[CURLOPT_SSL_VERIFYHOST] = false;        }        curl_setopt_array($ch, (array)$options + $defaults);        $ret = curl_exec($ch);        $err = curl_error($ch);        if (false === $ret || !empty($err)) {            $errno = curl_errno($ch);            $info = curl_getinfo($ch);            curl_close($ch);            return [                'ret'   => false,                'errno' => $errno,                'msg'   => $err,                'info'  => $info,            ];        }        curl_close($ch);        return [            'ret' => true,            'msg' => $ret,        ];    }    /**     * 异步发送一个请求     * @param string $url    请求的链接     * @param mixed  $params 请求的参数     * @param string $method 请求的方法     * @return boolean TRUE     */    public static function sendAsyncRequest($url, $params = [], $method = 'POST')    {        $method = strtoupper($method);        $method = $method == 'POST' ? 'POST' : 'GET';        //构造传递的参数        if (is_array($params)) {            $post_params = [];            foreach ($params as $k => &$v) {                if (is_array($v)) {                    $v = implode(',', $v);                }                $post_params[] = $k . '=' . urlencode($v);            }            $post_string = implode('&', $post_params);        } else {            $post_string = $params;        }        $parts = parse_url($url);        //构造查询的参数        if ($method == 'GET' && $post_string) {            $parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;            $post_string = '';        }        $parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';        //发送socket请求,获得连接句柄        $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);        if (!$fp) {            return false;        }        //设置超时时间        stream_set_timeout($fp, 3);        $out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";        $out .= "Host: {$parts['host']}\r\n";        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";        $out .= "Content-Length: " . strlen($post_string) . "\r\n";        $out .= "Connection: Close\r\n\r\n";        if ($post_string !== '') {            $out .= $post_string;        }        fwrite($fp, $out);        //不用关心服务器返回结果        //echo fread($fp, 1024);        fclose($fp);        return true;    }    /**     * 发送文件到客户端     * @param string $file     * @param bool   $delaftersend     * @param bool   $exitaftersend     */    public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true)    {        if (file_exists($file) && is_readable($file)) {            header('Content-Description: File Transfer');            header('Content-Type: application/octet-stream');            header('Content-Disposition: attachment;filename = ' . basename($file));            header('Content-Transfer-Encoding: binary');            header('Expires: 0');            header('Cache-Control: must-revalidate, post-check = 0, pre-check = 0');            header('Pragma: public');            header('Content-Length: ' . filesize($file));            ob_clean();            flush();            readfile($file);            if ($delaftersend) {                unlink($file);            }            if ($exitaftersend) {                exit;            }        }    }}
 |