curl.init.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. if (!defined('IS_INITPHP')) exit('Access Denied!');
  3. /*********************************************************************************
  4. * InitPHP 3.5 国产PHP开发框架 扩展类库-CURL
  5. *-------------------------------------------------------------------------------
  6. * 版权所有: CopyRight By initphp.com
  7. * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
  8. *-------------------------------------------------------------------------------
  9. * $Author:zhuli
  10. * $Dtime:2013-5-29
  11. ***********************************************************************************/
  12. class curlInit {
  13. public function __construct(){
  14. if (!extension_loaded("curl")){
  15. throw new Exception("PHP不支持curl扩展,请检查php.ini配置!");
  16. }
  17. }
  18. private $cookie = '/data/cookie.txt'; //cookie保存路径,相对于APP_PATH
  19. private $timeout = 10;
  20. /**
  21. * CURL-get方式获取数据
  22. * @param string $url URL
  23. * @param string $proxy 是否代理
  24. * @param int $timeout 请求时间
  25. * @param array $header header信息
  26. */
  27. public function get($url, $proxy = null, $timeout = 10, $header=null) {
  28. if (!$url) return false;
  29. $ssl = stripos($url,'https://') === 0 ? true : false;
  30. $curl = curl_init();
  31. if (!is_null($proxy)) curl_setopt ($curl, CURLOPT_PROXY, $proxy);
  32. curl_setopt($curl, CURLOPT_URL, $url);
  33. if ($ssl) {
  34. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  35. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  36. }
  37. $cookie_file = $this->get_cookie_file();
  38. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  39. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  40. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  41. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  42. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  43. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  44. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
  45. if (is_array($header))
  46. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  47. $content = curl_exec($curl);
  48. $curl_errno = curl_errno($curl);
  49. if ($curl_errno > 0){
  50. $error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno);
  51. curl_close($curl);
  52. throw new Exception($error);
  53. }
  54. curl_close($curl);
  55. return $content;
  56. }
  57. /**
  58. * CURL-post方式获取数据
  59. * @param string $url URL
  60. * @param array $data POST数据
  61. * @param string $proxy 是否代理
  62. * @param int $timeout 请求时间
  63. * @param array $header header信息
  64. */
  65. public function post($url, $data, $proxy = null, $timeout = 10, $header=null) {
  66. if (!$url) return false;
  67. if ($data) {
  68. $data = http_build_query($data);
  69. }
  70. $ssl = stripos($url,'https://') === 0 ? true : false;
  71. $curl = curl_init();
  72. if (!is_null($proxy)) curl_setopt ($curl, CURLOPT_PROXY, $proxy);
  73. curl_setopt($curl, CURLOPT_URL, $url);
  74. if ($ssl) {
  75. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  76. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  77. }
  78. $cookie_file = $this->get_cookie_file();
  79. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  80. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  81. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  82. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  83. curl_setopt($curl, CURLOPT_POST, true); //发送一个常规的Post请求
  84. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包
  85. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  86. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  87. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数。
  88. if (is_array($header))
  89. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  90. $content = curl_exec($curl);
  91. $curl_errno = curl_errno($curl);
  92. if ($curl_errno > 0){
  93. $error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno);
  94. curl_close($curl);
  95. throw new Exception($error);
  96. }
  97. curl_close($curl);
  98. return $content;
  99. }
  100. /**
  101. * CURL-put方式获取数据
  102. * @param string $url URL
  103. * @param array $data POST数据
  104. * @param string $proxy 是否代理
  105. * @param int $timeout 请求时间
  106. * @param array $header header信息
  107. */
  108. public function put($url, $data, $proxy = null, $timeout = 10, $header=null) {
  109. if (!$url) return false;
  110. if ($data) {
  111. $data = http_build_query($data);
  112. }
  113. $ssl = stripos($url,'https://') === 0 ? true : false;
  114. $curl = curl_init();
  115. if (!is_null($proxy)) curl_setopt ($curl, CURLOPT_PROXY, $proxy);
  116. curl_setopt($curl, CURLOPT_URL, $url);
  117. if ($ssl) {
  118. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  119. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  120. }
  121. $cookie_file = $this->get_cookie_file();
  122. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  123. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  124. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  125. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  126. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  127. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  128. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
  129. $data = (is_array($data)) ? http_build_query($data) : $data;
  130. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
  131. curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
  132. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  133. if (is_array($header))
  134. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  135. $content = curl_exec($curl);
  136. $curl_errno = curl_errno($curl);
  137. if ($curl_errno > 0){
  138. $error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno);
  139. curl_close($curl);
  140. throw new Exception($error);
  141. }
  142. curl_close($curl);
  143. return $content;
  144. }
  145. /**
  146. * CURL-DEL方式获取数据
  147. * @param string $url URL
  148. * @param array $data POST数据
  149. * @param string $proxy 是否代理
  150. * @param int $timeout 请求时间
  151. * @param array $header header信息
  152. */
  153. public function del($url, $data, $proxy = null, $timeout = 10, $header=null) {
  154. if (!$url) return false;
  155. if ($data) {
  156. $data = http_build_query($data);
  157. }
  158. $ssl = stripos($url,'https://') === 0 ? true : false;
  159. $curl = curl_init();
  160. if (!is_null($proxy)) curl_setopt ($curl, CURLOPT_PROXY, $proxy);
  161. curl_setopt($curl, CURLOPT_URL, $url);
  162. if ($ssl) {
  163. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
  164. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
  165. }
  166. $cookie_file = $this->get_cookie_file();
  167. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。
  168. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  169. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //在HTTP请求中包含一个"User-Agent: "头的字符串。
  170. curl_setopt($curl, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
  171. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  172. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //文件流形式
  173. curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); //设置cURL允许执行的最长秒数
  174. $data = (is_array($data)) ? http_build_query($data) : $data;
  175. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DEL');
  176. curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
  177. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  178. if (is_array($header))
  179. curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //设置请求的Header
  180. $content = curl_exec($curl);
  181. $curl_errno = curl_errno($curl);
  182. if ($curl_errno > 0){
  183. $error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno);
  184. curl_close($curl);
  185. throw new Exception($error);
  186. }
  187. curl_close($curl);
  188. return $content;
  189. }
  190. /**
  191. * 自定义执行curl函数,作为默认get/post/put/del方法的补充
  192. * @todo 下一步准备用exec封装get/post/put/del方法,减少代码冗余
  193. * @param string $url 请求的URL的完整地址如:http://www.initphp.com/
  194. * @param array|string $data post/put/del提交的数据,可以是query string或php数组
  195. * @param array $options 自定义参数,格式与curl_setopt_array要求一致
  196. * @return string
  197. * @throws Exception
  198. */
  199. public function exec($url, $data=array(), array $options=array()){
  200. $curl = curl_init();
  201. if ($url) $options[CURLOPT_URL] = $url; //请求的URL,完整地址
  202. if($data){//post/put/del请求的数据设置
  203. $options[CURLOPT_POSTFIELDS] = is_array($data) ? http_build_query($data) : strval($data);
  204. !isset($options[CURLOPT_CUSTOMREQUEST]) && $options[CURLOPT_POST] = true;
  205. }
  206. //默认选项
  207. !isset($options[CURLOPT_HEADER]) && $options[CURLOPT_HEADER] = 0;//启用时会将头文件的信息作为数据流输出。
  208. !isset($options[CURLOPT_FOLLOWLOCATION]) && $options[CURLOPT_FOLLOWLOCATION] = 1;//启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
  209. !isset($options[CURLOPT_RETURNTRANSFER]) && $options[CURLOPT_RETURNTRANSFER] = 1;//文件流形式
  210. !isset($options[CURLOPT_TIMEOUT]) && $options[CURLOPT_TIMEOUT] = $this->get_timeout();//curl执行超时时间
  211. !isset($options[CURLOPT_COOKIEJAR]) && $options[CURLOPT_COOKIEJAR] = $this->get_cookie_file();//连接结束后保存cookie信息的文件。
  212. !isset($options[CURLOPT_COOKIEFILE]) && $options[CURLOPT_COOKIEFILE] = $this->get_cookie_file();//包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
  213. !isset($options[CURLOPT_USERAGENT]) && $options[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];//在HTTP请求中包含一个"User-Agent: "头的字符串。
  214. curl_setopt_array($curl, $options);
  215. //执行并返回
  216. $content = curl_exec($curl);
  217. $curl_errno = curl_errno($curl);
  218. if ($curl_errno > 0){
  219. $error = sprintf("curl error=%s, errno=%d.", curl_error($curl), $curl_errno);
  220. curl_close($curl);
  221. throw new Exception($error);
  222. }
  223. curl_close($curl);
  224. return $content;
  225. }
  226. /**
  227. * 获取COOKIE存放文件的地址
  228. */
  229. private function get_cookie_file() {
  230. return APP_PATH . $this->cookie;
  231. }
  232. /**
  233. * 获取curl超时时间
  234. * @return int
  235. */
  236. private function get_timeout(){
  237. return $this->timeout;
  238. }
  239. }