Http.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. namespace fast;
  3. /**
  4. * 字符串类
  5. */
  6. class Http
  7. {
  8. /**
  9. * 发送一个POST请求
  10. */
  11. public static function post($url, $params = [], $options = [])
  12. {
  13. $req = self::sendRequest($url, $params, 'POST', $options);
  14. return $req['ret'] ? $req['msg'] : '';
  15. }
  16. /**
  17. * 发送一个GET请求
  18. */
  19. public static function get($url, $params = [], $options = [])
  20. {
  21. $req = self::sendRequest($url, $params, 'GET', $options);
  22. return $req['ret'] ? $req['msg'] : '';
  23. }
  24. /**
  25. * CURL发送Request请求,含POST和REQUEST
  26. * @param string $url 请求的链接
  27. * @param mixed $params 传递的参数
  28. * @param string $method 请求的方法
  29. * @param mixed $options CURL的参数
  30. * @return array
  31. */
  32. public static function sendRequest($url, $params = [], $method = 'POST', $options = [])
  33. {
  34. $method = strtoupper($method);
  35. $protocol = substr($url, 0, 5);
  36. $query_string = is_array($params) ? http_build_query($params) : $params;
  37. $ch = curl_init();
  38. $defaults = [];
  39. if ('GET' == $method)
  40. {
  41. $geturl = $query_string ? $url . (stripos($url, "?") !== FALSE ? "&" : "?") . $query_string : $url;
  42. $defaults[CURLOPT_URL] = $geturl;
  43. }
  44. else
  45. {
  46. $defaults[CURLOPT_URL] = $url;
  47. if ($method == 'POST')
  48. {
  49. $defaults[CURLOPT_POST] = 1;
  50. }
  51. else
  52. {
  53. $defaults[CURLOPT_CUSTOMREQUEST] = $method;
  54. }
  55. $defaults[CURLOPT_POSTFIELDS] = $query_string;
  56. }
  57. $defaults[CURLOPT_HEADER] = FALSE;
  58. $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";
  59. $defaults[CURLOPT_FOLLOWLOCATION] = TRUE;
  60. $defaults[CURLOPT_RETURNTRANSFER] = TRUE;
  61. $defaults[CURLOPT_CONNECTTIMEOUT] = 3;
  62. $defaults[CURLOPT_TIMEOUT] = 3;
  63. // disable 100-continue
  64. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
  65. if ('https' == $protocol)
  66. {
  67. $defaults[CURLOPT_SSL_VERIFYPEER] = FALSE;
  68. $defaults[CURLOPT_SSL_VERIFYHOST] = FALSE;
  69. }
  70. curl_setopt_array($ch, (array) $options + $defaults);
  71. $ret = curl_exec($ch);
  72. $err = curl_error($ch);
  73. if (FALSE === $ret || !empty($err))
  74. {
  75. $errno = curl_errno($ch);
  76. $info = curl_getinfo($ch);
  77. curl_close($ch);
  78. return [
  79. 'ret' => FALSE,
  80. 'errno' => $errno,
  81. 'msg' => $err,
  82. 'info' => $info,
  83. ];
  84. }
  85. curl_close($ch);
  86. return [
  87. 'ret' => TRUE,
  88. 'msg' => $ret,
  89. ];
  90. }
  91. /**
  92. * 异步发送一个请求
  93. * @param string $url 请求的链接
  94. * @param mixed $params 请求的参数
  95. * @param string $method 请求的方法
  96. * @return boolean TRUE
  97. */
  98. public static function sendAsyncRequest($url, $params = [], $method = 'POST')
  99. {
  100. $method = strtoupper($method);
  101. $method = $method == 'POST' ? 'POST' : 'GET';
  102. //构造传递的参数
  103. if (is_array($params))
  104. {
  105. $post_params = [];
  106. foreach ($params as $k => &$v)
  107. {
  108. if (is_array($v))
  109. $v = implode(',', $v);
  110. $post_params[] = $k . '=' . urlencode($v);
  111. }
  112. $post_string = implode('&', $post_params);
  113. }else
  114. {
  115. $post_string = $params;
  116. }
  117. $parts = parse_url($url);
  118. //构造查询的参数
  119. if ($method == 'GET' && $post_string)
  120. {
  121. $parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;
  122. $post_string = '';
  123. }
  124. $parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';
  125. //发送socket请求,获得连接句柄
  126. $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);
  127. if (!$fp)
  128. return FALSE;
  129. //设置超时时间
  130. stream_set_timeout($fp, 3);
  131. $out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";
  132. $out.= "Host: {$parts['host']}\r\n";
  133. $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
  134. $out.= "Content-Length: " . strlen($post_string) . "\r\n";
  135. $out.= "Connection: Close\r\n\r\n";
  136. if ($post_string !== '')
  137. $out .= $post_string;
  138. fwrite($fp, $out);
  139. //不用关心服务器返回结果
  140. //echo fread($fp, 1024);
  141. fclose($fp);
  142. return TRUE;
  143. }
  144. /**
  145. * 发送文件到客户端
  146. * @param string $file
  147. * @param bool $delaftersend
  148. * @param bool $exitaftersend
  149. */
  150. public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true)
  151. {
  152. if (file_exists($file) && is_readable($file))
  153. {
  154. header('Content-Description: File Transfer');
  155. header('Content-Type: application/octet-stream');
  156. header('Content-Disposition: attachment;filename = ' . basename($file));
  157. header('Content-Transfer-Encoding: binary');
  158. header('Expires: 0');
  159. header('Cache-Control: must-revalidate, post-check = 0, pre-check = 0');
  160. header('Pragma: public');
  161. header('Content-Length: ' . filesize($file));
  162. ob_clean();
  163. flush();
  164. readfile($file);
  165. if ($delaftersend)
  166. {
  167. unlink($file);
  168. }
  169. if ($exitaftersend)
  170. {
  171. exit;
  172. }
  173. }
  174. }
  175. }