wx_http.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <?php
  2. /**
  3. * Created by 上海风车教育科技有限公司.
  4. * User: 刘红伟
  5. * Date: 15-11-24
  6. * Email: 454303753@qq.com
  7. * File:httpd.php
  8. */
  9. class wx_http {
  10. /**
  11. * @var 使用 CURL
  12. */
  13. private function __construct(){}
  14. private function __clone(){}
  15. const TYPE_CURL = 1;
  16. public static function factory($url = '', $type = self::TYPE_CURL)
  17. {
  18. if (empty($type)) $type = self::TYPE_CURL;
  19. switch($type)
  20. {
  21. case self::TYPE_CURL:
  22. if ( ! function_exists('curl_init'))
  23. throw new Exception(__CLASS__ ." PHP CURL extension not install");
  24. $obj = Http_Curl::getInstance($url);
  25. break;
  26. default:
  27. throw new Exception("http access type $type not support");
  28. }
  29. return $obj;
  30. }
  31. /**
  32. * 生成一个供Cookie或HTTP GET Query的字符串
  33. *
  34. * @param array $data 需要生产的数据数组,必须是 Name => Value 结构
  35. * @param string $sep 两个变量值之间分割的字符,缺省是 &
  36. * @return string 返回生成好的Cookie查询字符串
  37. */
  38. public static function makeQuery($data, $sep = '&')
  39. {
  40. $encoded = '';
  41. if (is_array($data))
  42. {
  43. while (list($k, $v) = each($data))
  44. {
  45. $encoded .= ($encoded ? "$sep" : "");
  46. $encoded .= rawurlencode($k) ."=". rawurlencode($v);
  47. }
  48. }
  49. return $encoded;
  50. }
  51. }
  52. class Http_Curl {
  53. /**
  54. * @var object 对象单例
  55. */
  56. static $_instance = NULL;
  57. /**
  58. * @var string 需要发送的cookie信息
  59. */
  60. private $cookies = '';
  61. /**
  62. * @var array 需要发送的头信息
  63. */
  64. private $header = array();
  65. /**
  66. * @var string 需要访问的URL地址
  67. */
  68. private $uri = '';
  69. /**
  70. * @var array 需要发送的数据
  71. */
  72. private $vars = array();
  73. /**
  74. * 构造函数
  75. *
  76. * @param string $configFile 配置文件路径
  77. */
  78. private function __construct($url)
  79. {
  80. $this->uri = $url;
  81. }
  82. /**
  83. * 保证对象不被clone
  84. */
  85. private function __clone() {}
  86. /**
  87. * 获取对象唯一实例
  88. *
  89. * @param string $configFile 配置文件路径
  90. * @return object 返回本对象实例
  91. */
  92. public static function getInstance($url = '')
  93. {
  94. if ( ! (self::$_instance instanceof self))
  95. {
  96. self::$_instance = new self($url);
  97. }
  98. return self::$_instance;
  99. }
  100. /**
  101. * 设置需要发送的HTTP头信息
  102. *
  103. * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组
  104. * 或单一的一条类似于 'Host: example.com' 头信息字符串
  105. * @return void
  106. */
  107. public function setHeader($header)
  108. {
  109. if (empty($header)) return;
  110. if (is_array($header))
  111. {
  112. foreach ($header as $k => $v)
  113. {
  114. $this->header[] = is_numeric($k) ? trim($v) : (trim($k) .": ". trim($v));
  115. }
  116. }
  117. elseif (is_string($header))
  118. {
  119. $this->header[] = $header;
  120. }
  121. }
  122. /**
  123. * 设置Cookie头信息
  124. *
  125. * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置
  126. *
  127. * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,
  128. * 或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组
  129. * @return void
  130. */
  131. public function setCookie($cookie)
  132. {
  133. if (empty($cookie)) return;
  134. if (is_array($cookie)) $this->cookies = wx_Http::makeQuery($cookie, ';');
  135. elseif (is_string($cookie)) $this->cookies = $cookie;
  136. }
  137. /**
  138. * 设置要发送的数据信息
  139. *
  140. * 注意:本函数只能调用一次,下次调用会覆盖上一次的设置
  141. *
  142. * @param array 设置需要发送的数据信息,一个类似于 array('name1'=>'value1', 'name2'=>'value2') 的一维数组
  143. * @return void
  144. */
  145. public function setVar($vars)
  146. {
  147. if (empty($vars)) return;
  148. if ($vars) $this->vars = $vars;
  149. }
  150. /**
  151. * 设置要请求的URL地址
  152. *
  153. * @param string $url 需要设置的URL地址
  154. * @return void
  155. */
  156. public function setUrl($url)
  157. {
  158. if ($url != '') $this->uri = $url;
  159. }
  160. /**
  161. * 发送HTTP GET请求
  162. *
  163. * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数
  164. * @param array $vars 需要单独返送的GET变量
  165. * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组
  166. * 或单一的一条类似于 'Host: example.com' 头信息字符串
  167. * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,
  168. * 或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组
  169. * @param int $timeout 连接对方服务器访问超时时间,单位为秒
  170. * @param array $options 当前操作类一些特殊的属性设置
  171. * @return unknown
  172. */
  173. public function get($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array())
  174. {
  175. $this->setUrl($url);
  176. $this->setHeader($header);
  177. $this->setCookie($cookie);
  178. $this->setVar($vars);
  179. return $this->send('GET', $timeout);
  180. }
  181. /**
  182. * 发送HTTP POST请求
  183. *
  184. * @param string $url 如果初始化对象的时候没有设置或者要设置不同的访问URL,可以传本参数
  185. * @param array $vars 需要单独返送的GET变量
  186. * @param array/string 需要设置的头信息,可以是一个 类似 array('Host: example.com', 'Accept-Language: zh-cn') 的头信息数组
  187. * 或单一的一条类似于 'Host: example.com' 头信息字符串
  188. * @param string/array 需要设置的Cookie信息,一个类似于 'name1=value1&name2=value2' 的Cookie字符串信息,
  189. * 或者是一个 array('name1'=>'value1', 'name2'=>'value2') 的一维数组
  190. * @param int $timeout 连接对方服务器访问超时时间,单位为秒
  191. * @param array $options 当前操作类一些特殊的属性设置
  192. * @return unknown
  193. */
  194. public function post($url = '', $vars = array(), $header = array(), $cookie = '', $timeout = 5, $options = array())
  195. {
  196. $this->setUrl($url);
  197. $this->setHeader($header);
  198. // $this->setCookie($cookie);
  199. $this->setVar($vars);
  200. return $this->send('POST', $timeout);
  201. }
  202. /**
  203. * 发送HTTP请求核心函数
  204. *
  205. * @param string $method 使用GET还是POST方式访问
  206. * @param array $vars 需要另外附加发送的GET/POST数据
  207. * @param int $timeout 连接对方服务器访问超时时间,单位为秒
  208. * @param array $options 当前操作类一些特殊的属性设置
  209. * @return string 返回服务器端读取的返回数据
  210. */
  211. public function send($method = 'GET', $timeout = 5, $options = array())
  212. {
  213. // 处理参数是否为空
  214. if ($this->uri == '')
  215. throw new Exception(__CLASS__ .": Access url is empty");
  216. // 初始化CURL
  217. $ch = curl_init();
  218. curl_setopt($ch, CURLOPT_HEADER, 0);
  219. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  220. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  221. curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  222. // SSL 验证证书和host
  223. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  224. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  225. // 设置特殊属性
  226. if ( ! empty($options))
  227. curl_setopt_array($ch , $options);
  228. //处理GET请求参数
  229. if ($method == 'GET' AND ! empty($this->vars))
  230. {
  231. $query = Http::makeQuery($this->vars);
  232. $parse = parse_url($this->uri);
  233. $sep = isset($parse['query']) ? '&' : '?';
  234. $this->uri .= $sep . $query;
  235. }
  236. // 处理POST请求数据
  237. if ($method == 'POST')
  238. {
  239. curl_setopt($ch, CURLOPT_POST, 1 );
  240. curl_setopt($ch, CURLOPT_POSTFIELDS, $this->vars);
  241. }
  242. // 设置cookie信息
  243. if ( ! empty($this->cookies))
  244. curl_setopt($ch, CURLOPT_COOKIE, $this->cookies);
  245. // 设置HTTP缺省头
  246. if (empty($this->header))
  247. {
  248. $this->header = array(
  249. 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)',
  250. //'Accept-Language: zh-cn',
  251. //'Cache-Control: no-cache',
  252. );
  253. }
  254. curl_setopt($ch, CURLOPT_HTTPHEADER, $this->header);
  255. // 发送请求读取输数据
  256. curl_setopt($ch, CURLOPT_URL, $this->uri);
  257. $data = curl_exec($ch);
  258. if (($err = curl_error($ch)))
  259. {
  260. curl_close($ch);
  261. throw new Exception(__CLASS__ ." error: ". $err);
  262. }
  263. curl_close($ch);
  264. return $data;
  265. }
  266. }