Curl.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: chendeben
  5. * Date: 2018/8/17
  6. * Time: 下午5:26
  7. */
  8. namespace Heanup\Library;
  9. use Heanup\Frame\Logger;
  10. class Curl
  11. {
  12. private static $cookie_file = "curl_cookie.log";
  13. /**
  14. * CURL-get方式获取数据
  15. * @param string $url URL
  16. * @param string $proxy 是否代理
  17. * @param int $timeout 请求时间
  18. * @param array $header header信息 array('Host: api.kingdee.meitushop.com' )设置请求的host
  19. * @param null $REFERER
  20. * @return string
  21. */
  22. public static function get($url, $proxy = null, $timeout = 10, $header = null, $REFERER = null)
  23. {
  24. if (!$url)
  25. return false;
  26. $ssl = stripos($url, 'https://') === 0;
  27. $curl = curl_init();
  28. if (!is_null($proxy))
  29. curl_setopt($curl, CURLOPT_PROXY, $proxy);
  30. curl_setopt($curl, CURLOPT_URL, $url);
  31. if ($ssl) {
  32. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  33. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  34. }
  35. if ($REFERER) {
  36. curl_setopt($curl, CURLOPT_REFERER, $REFERER);//模拟来路
  37. }
  38. $cookie_file = self::$cookie_file;
  39. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  40. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  41. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  42. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  43. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  44. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  45. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
  46. if (is_array($header))
  47. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  48. $content = curl_exec($curl);
  49. $curl_errno = curl_errno($curl);
  50. if ($curl_errno > 0) {
  51. Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
  52. curl_close($curl);
  53. return false;
  54. }
  55. // $this->http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  56. curl_close($curl);
  57. return removeBOM($content);
  58. }
  59. /**
  60. * CURL-post方式获取数据
  61. * @param string $url URL
  62. * @param array $data POST数据
  63. * @param string $proxy 是否代理
  64. * @param int $timeout 请求时间
  65. * @param array $header header信息
  66. * @return string
  67. */
  68. public static function post($url, $data, $proxy = null, $timeout = 10, $header = null)
  69. {
  70. if (!$url)
  71. return false;
  72. // if ($data) {
  73. // $data = http_build_query($data);
  74. // }
  75. $ssl = stripos($url, 'https://') === 0 ? true : false;
  76. $curl = curl_init();
  77. if (!is_null($proxy))
  78. curl_setopt($curl, CURLOPT_PROXY, $proxy);
  79. curl_setopt($curl, CURLOPT_URL, $url);
  80. if ($ssl) {
  81. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  82. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  83. }
  84. $cookie_file = self::$cookie_file;
  85. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  86. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  87. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  88. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  89. curl_setopt($curl, CURLOPT_POST, true); //发送一个常规的Post请求
  90. curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //Post提交的数据包
  91. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  92. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  93. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
  94. if (is_array($header))
  95. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  96. $content = curl_exec($curl);
  97. $curl_errno = curl_errno($curl);
  98. if ($curl_errno > 0) {
  99. Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
  100. curl_close($curl);
  101. return false;
  102. }
  103. // $this->http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  104. curl_close($curl);
  105. return $content;
  106. }
  107. /**
  108. * CURL-put方式获取数据
  109. * @param string $url URL
  110. * @param array $data POST数据
  111. * @param string $proxy 是否代理
  112. * @param int $timeout 请求时间
  113. * @param array $header header信息
  114. * @return string
  115. */
  116. public static function put($url, $data, $proxy = null, $timeout = 10, $header = null)
  117. {
  118. if (!$url)
  119. return false;
  120. if ($data) {
  121. $data = http_build_query($data);
  122. }
  123. $ssl = stripos($url, 'https://') === 0 ? true : false;
  124. $curl = curl_init();
  125. if (!is_null($proxy))
  126. curl_setopt($curl, CURLOPT_PROXY, $proxy);
  127. curl_setopt($curl, CURLOPT_URL, $url);
  128. if ($ssl) {
  129. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  130. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  131. }
  132. $cookie_file = self::$cookie_file;
  133. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  134. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  135. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  136. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  137. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  138. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  139. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
  140. $data = (is_array($data)) ? http_build_query($data) : $data;
  141. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
  142. curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
  143. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  144. if (is_array($header))
  145. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  146. $content = curl_exec($curl);
  147. $curl_errno = curl_errno($curl);
  148. if ($curl_errno > 0) {
  149. Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
  150. curl_close($curl);
  151. return false;
  152. }
  153. curl_close($curl);
  154. return $content;
  155. }
  156. /**
  157. * CURL-DEL方式获取数据
  158. * @param string $url URL
  159. * @param array $data POST数据
  160. * @param string $proxy 是否代理
  161. * @param int $timeout 请求时间
  162. * @param array $header header信息
  163. * @return string
  164. */
  165. public static function del($url, $data, $proxy = null, $timeout = 10, $header = null)
  166. {
  167. if (!$url)
  168. return false;
  169. if ($data) {
  170. $data = http_build_query($data);
  171. }
  172. $ssl = stripos($url, 'https://') === 0 ? true : false;
  173. $curl = curl_init();
  174. if (!is_null($proxy))
  175. curl_setopt($curl, CURLOPT_PROXY, $proxy);
  176. curl_setopt($curl, CURLOPT_URL, $url);
  177. if ($ssl) {
  178. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  179. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  180. }
  181. $cookie_file = self::$cookie_file;
  182. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  183. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); //包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  184. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  185. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  186. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  187. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  188. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
  189. $data = (is_array($data)) ? http_build_query($data) : $data;
  190. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DEL');
  191. curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
  192. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  193. if (is_array($header))
  194. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  195. $content = curl_exec($curl);
  196. $curl_errno = curl_errno($curl);
  197. if ($curl_errno > 0) {
  198. Logger::setlog($error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno));
  199. curl_close($curl);
  200. return false;
  201. }
  202. curl_close($curl);
  203. return $content;
  204. }
  205. }