HttpService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace crmeb\services;
  3. /**
  4. * curl 请求
  5. * Class HttpService
  6. * @package crmeb\services
  7. */
  8. class HttpService
  9. {
  10. /**
  11. * 错误信息
  12. * @var string
  13. */
  14. private static $curlError;
  15. /**
  16. * header头信息
  17. * @var string
  18. */
  19. private static $headerStr;
  20. /**
  21. * 请求状态
  22. * @var int
  23. */
  24. private static $status;
  25. /**
  26. * 获取请求错误信息
  27. * @return string
  28. */
  29. public static function getCurlError()
  30. {
  31. return self::$curlError;
  32. }
  33. /**
  34. * 获取请求响应状态
  35. * @return mixed
  36. */
  37. public static function getStatus()
  38. {
  39. return self::$status;
  40. }
  41. /**
  42. * 模拟GET发起请求
  43. * @param $url 请求地址
  44. * @param array $data 请求数据
  45. * @param bool $header header头
  46. * @param int $timeout 响应超时时间
  47. * @return bool|string
  48. */
  49. public static function getRequest($url, $data = array(), $header = false, $timeout = 10)
  50. {
  51. if (!empty($data)) {
  52. $url .= (stripos($url, '?') === false ? '?' : '&');
  53. $url .= (is_array($data) ? http_build_query($data) : $data);
  54. }
  55. return self::request($url, 'get', array(), $header, $timeout);
  56. }
  57. /**
  58. * curl 请求
  59. * @param $url 请求地址
  60. * @param string $method 请求方式
  61. * @param array $data 请求数据
  62. * @param bool $header 请求header头
  63. * @param int $timeout 超时秒数
  64. * @return bool|string
  65. */
  66. public static function request($url, $method = 'get', $data = array(), $header = false, $timeout = 15)
  67. {
  68. self::$status = null;
  69. self::$curlError = null;
  70. self::$headerStr = null;
  71. $curl = curl_init($url);
  72. $method = strtoupper($method);
  73. //请求方式
  74. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
  75. //post请求
  76. if ($method == 'POST') curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  77. //超时时间
  78. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
  79. //设置header头
  80. if ($header !== false) curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  81. curl_setopt($curl, CURLOPT_FAILONERROR, false);
  82. //返回抓取数据
  83. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  84. //输出header头信息
  85. curl_setopt($curl, CURLOPT_HEADER, true);
  86. //TRUE 时追踪句柄的请求字符串,从 PHP 5.1.3 开始可用。这个很关键,就是允许你查看请求header
  87. curl_setopt($curl, CURLINFO_HEADER_OUT, true);
  88. //https请求
  89. if (1 == strpos("$" . $url, "https://")) {
  90. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  91. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  92. }
  93. self::$curlError = curl_error($curl);
  94. list($content, $status) = [curl_exec($curl), curl_getinfo($curl), curl_close($curl)];
  95. self::$status = $status;
  96. self::$headerStr = trim(substr($content, 0, $status['header_size']));
  97. $content = trim(substr($content, $status['header_size']));
  98. return (intval($status["http_code"]) === 200) ? $content : false;
  99. }
  100. /**
  101. * 模拟POST发起请求
  102. * @param $url 请求链接
  103. * @param array $data 请求参数
  104. * @param bool $header header头
  105. * @param int $timeout 超时秒数
  106. * @return bool|string
  107. */
  108. public static function postRequest($url, array $data = array(), $header = false, $timeout = 10)
  109. {
  110. return self::request($url, 'post', $data, $header, $timeout);
  111. }
  112. /**
  113. * 获取header头字符串类型
  114. * @return mixed
  115. */
  116. public static function getHeaderStr(): string
  117. {
  118. return self::$headerStr;
  119. }
  120. /**
  121. * 获取header头数组类型
  122. * @return array
  123. */
  124. public static function getHeader(): array
  125. {
  126. $headArr = explode("\r\n", self::$headerStr);
  127. return $headArr;
  128. }
  129. }