Curl.php 11 KB

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