http.init.php 6.8 KB

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