186 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace 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] = is_array($params) && count(array_filter($params, 'is_array')) > 0 ? $query_string : $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] = 10;
							 | 
						||
| 
								 | 
							
								        $defaults[CURLOPT_TIMEOUT] = 10;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 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'], $parts['port'] ?? 80, $errno, $errstr, 10);
							 | 
						||
| 
								 | 
							
								        if (!$fp) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        //设置超时时间
							 | 
						||
| 
								 | 
							
								        stream_set_timeout($fp, 10);
							 | 
						||
| 
								 | 
							
								        $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;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |