http.init.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. if (!defined('IS_INITPHP')) exit('Access Denied!');
  3. /*********************************************************************************
  4. * InitPHP 3.8.2 国产PHP开发框架 扩展类库-HTTP
  5. *-------------------------------------------------------------------------------
  6. * 版权所有: CopyRight By initphp.com
  7. * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
  8. *-------------------------------------------------------------------------------
  9. * Author:zhuli Dtime:2014-11-25
  10. ***********************************************************************************/
  11. class httpInit {
  12. private $defaultFlen = 8192;//fread默认读取最大长度
  13. private $block = true;//读取网络流 是否阻塞,true|阻塞,false|不阻塞
  14. private $defaultPort = 80; //默认端口号
  15. /**
  16. * 通过http方式获取数据
  17. * 使用方法:$temp = $obj->httpGet($url, $post, $ip, $timeout=15, $cookie='', $freadLen=0);
  18. * 返回:HTTP获取处理后的信息
  19. * @param string $url 链接地址
  20. * @param array $post post内容,没有则为空
  21. * @param string $ip ip地址
  22. * @param int $timeout 超时时间
  23. * @param string $cookie cookie
  24. * @param int $freadLen 长度
  25. * @return string
  26. */
  27. public function httpGet($url, $post, $ip='', $timeout=15, $cookie='', $freadLen=0) {
  28. //处理参数
  29. $data = $this->parseParam($url, $post, $ip, $timeout, $cookie, $freadLen);
  30. list($url, $post, $ip, $timeout, $port, $cookie, $freadLen) = array($data['url'], $data['post'], $data['ip'], $data['timeout'], $data['port'], $data['cookie'], $data['freadLen']);
  31. unset($data);
  32. //Header信息
  33. $httpReturn = $httpHeader = "";
  34. $httpHeader = ($post !== '') ? $this->httpPostHeader($url, $post, $ip, $port, $cookie) : $this->httpGetHeader($url, $post, $ip, $port, $cookie);
  35. //socket
  36. $httpFp = @fsockopen($ip, $port, $errno, $errstr, $timeout);
  37. @stream_set_blocking($httpFp, $this->block);
  38. @stream_set_timeout($httpFp, $timeout);
  39. @fwrite($httpFp, $httpHeader);
  40. $status = @stream_get_meta_data($httpFp);
  41. if ($httpFp == false || $status['timed_out']) {
  42. fclose($httpFp);
  43. return $httpReturn;
  44. }
  45. //fread
  46. $freadLen = ($freadLen == 0) ? $this->defaultFlen : (($freadLen > $this->defaultFlen) ? $this->defaultFlen : $freadLen);
  47. $isHttpHeader = $stopFread = false;
  48. while (!feof($httpFp) && !$stopFread) {
  49. if ((!$isHttpHeader) && ($tempHttpReturn = @fgets($httpFp)) && ($tempHttpReturn == "\r\n" || $tempHttpReturn == "\n")) $isHttpHeader = true;
  50. if ($isHttpHeader) {
  51. $httpReturn = @fread($httpFp, $freadLen);
  52. (strlen($httpReturn) > $freadLen) && $stopFread = true;
  53. }
  54. }
  55. fclose($httpFp);
  56. return $httpReturn;
  57. }
  58. /**
  59. * HTTP POST方式的header头部信息封装
  60. * @param string $url 链接地址
  61. * @param string $post post内容,没有则为空
  62. * @param string $ip ip地址
  63. * @param string $port 端口号
  64. * @param string $cookie cookie
  65. * @return string
  66. */
  67. private function httpPostHeader($url, $post, $ip, $port=80, $cookie='') {
  68. $httpHeader = '';
  69. $httpHeader .= "POST $url HTTP/1.0\r\n";
  70. $httpHeader .= "Accept: */*\r\n";
  71. $httpHeader .= "Accept-Language: zh-cn\r\n";
  72. $httpHeader .= "Content-Type: application/x-www-form-urlencoded\r\n";
  73. $httpHeader .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  74. $httpHeader .= "Content-Length: ".strlen($post)."\r\n";
  75. $httpHeader .= "Host: $ip:".(int)$port."\r\n";
  76. $httpHeader .= "Connection: Close\r\n";
  77. $httpHeader .= "Cache-Control: no-cache\r\n";
  78. $httpHeader .= "Cookie: $cookie\r\n\r\n";
  79. $httpHeader .= $post;
  80. return $httpHeader;
  81. }
  82. /**
  83. * HTTP GET方式的header头部信息封装
  84. * @param string $url 链接地址
  85. * @param string $post post内容,没有则为空
  86. * @param string $ip ip地址
  87. * @param string $port 端口号
  88. * @param string $cookie cookie
  89. * @return string
  90. */
  91. private function httpGetHeader($url, $post, $ip, $port=80, $cookie='') {
  92. $httpHeader = '';
  93. $httpHeader .= "GET $url HTTP/1.0\r\n";
  94. $httpHeader .= "Accept: */*\r\n";
  95. $httpHeader .= "Accept-Language: zh-cn\r\n";
  96. $httpHeader .= "Content-Type: application/x-www-form-urlencoded\r\n";
  97. $httpHeader .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  98. $httpHeader .= "Host: $ip:".(int)$port."\r\n";
  99. $httpHeader .= "Connection: Close\r\n";
  100. $httpHeader .= "Cookie: $cookie\r\n\r\n";
  101. return $httpHeader;
  102. }
  103. /**
  104. * 外部接收的数据进行内部处理
  105. * @param string $url 链接地址
  106. * @param array $post post内容,没有则为空
  107. * @param string $ip ip地址
  108. * @param int $timeout 超时时间
  109. * @param string $cookie cookie
  110. * @param int $freadLen 长度
  111. * @return array
  112. */
  113. private function parseParam($url, $post, $ip, $timeout, $cookie, $freadLen) {
  114. $tempArr = array();
  115. $tempArr['url'] = (string)$url;
  116. $tempArr['post'] = $this->parseArrToUrlstr((array)$post);
  117. $tempArr['ip'] = (string)$ip;
  118. $tempArr['timeout'] = (int)$timeout;
  119. $tempArr['port'] = $this->parsePort($url, $ip);
  120. $tempArr['cookie'] = (string)$cookie;
  121. $tempArr['freadLen']= (int)$freadLen;
  122. $tempArr['ip'] = ($tempArr['ip'] == '') ? $this->parseUrlToHost($tempArr['url']) : $tempArr['ip'];
  123. return $tempArr;
  124. }
  125. /**
  126. * 将数组参数转化成URL传输的参数
  127. * 数组:array("age"=>"我是test");
  128. * 转化:age=10&name=test 多维:a[age]=10&a[name]=test
  129. * @param array $arr 数组
  130. * @return string
  131. */
  132. private function parseArrToUrlstr($arr) {
  133. if (!is_array($arr)) return '';
  134. return http_build_query($arr, 'flags_');
  135. }
  136. /**
  137. * 获取URL中的HOST信息
  138. * URL:http://www.xxx.com/index.php
  139. * 返回: www.xxx.com
  140. * @param string $url URL链接
  141. * @return string
  142. */
  143. private function parseUrlToHost($url) {
  144. $parse = @parse_url($url);
  145. $reg = '/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/';
  146. if (empty($parse) || preg_match($reg,trim($url)) == false) return '';
  147. return str_replace(array('http://','https://'),array('','ssl://'),"$parse[scheme]://").$parse['host'];
  148. }
  149. /**
  150. * 获取端口号,返回INT类型端口,如果端口不存在,为设置的默认端口号
  151. * @param string $url URL链接
  152. * @param string $ip IP地址
  153. * @return int
  154. */
  155. private function parsePort($url, $ip) {
  156. $temp = array();
  157. if ($ip !== '') {
  158. if (strpos($ip, ':') === false) {
  159. $tempPort = $this->defaultPort;
  160. } else {
  161. $temp = explode(":", $ip);
  162. $tempPort = $temp[1];
  163. }
  164. } else {
  165. $temp = @parse_url($url);
  166. $tempPort = $temp['port'];
  167. }
  168. return ((int)$tempPort == 0) ? $this->defaultPort : $tempPort;
  169. }
  170. }