PHP curl及并发curl封装函数实现

单次post

 1 /**
 2  * 发送post请求
 3  *
 4  * @param $array 请求的参数
 5  * @param $timeoutLimit 执行超时时间
 6  * @param $connectTimeoutLimit 连接超时时间
 7  * @return mixed
 8  */
 9 public static function curl($array, $timeoutLimit, $connectTimeoutLimit)
10 {
11     $ch = curl_init();
12     $url = $array['url'];
13     $isHttps = false;
14     if(substr($url,0,5)=='https'){//判断是否为https
15         $isHttps = true;
16     }
17     curl_setopt($ch, CURLOPT_PROXY, $array['proxy']);//设置代理
18     if(strpos(strtolower($array['proxy_type']), 'so') !== false){//socket代理
19         curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
20     }else{
21         curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);//http代理
22     }
23     curl_setopt($ch, CURLOPT_URL, $array['url']);//设置目标url
24     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//返回结果,不输出内容
25     curl_setopt($ch, CURLOPT_TIMEOUT, $timeoutLimit);
26     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connectTimeoutLimit);
27 
28     //设置header
29     if (isset($array['header']) && $array['header']) {
30         curl_setopt($ch, CURLOPT_HEADER, 1);
31     }
32     if (isset($array['httpheader'])) {
33         curl_setopt($ch, CURLOPT_HTTPHEADER, $array['httpheader']);
34     }
35     //设置referer
36     if (isset($array['referer'])) {
37         curl_setopt($ch, CURLOPT_REFERER, $array['referer']);
38     }
39     //是否走post请求
40     if (isset($array['post'])) {
41         curl_setopt($ch, CURLOPT_POST, 1);
42         curl_setopt($ch, CURLOPT_POSTFIELDS, $array['post']);
43     }
44     //是否跟踪重定向
45     if (isset($array['followlocation'])) {
46         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $array['followlocation']);
47     }
48     if (isset($array['cookiefile'])) {//cookie文件
49         curl_setopt($ch, CURLOPT_COOKIEFILE, $array['cookiefile']);
50     }
51     if (isset($array['cookiejar'])) {
52         curl_setopt($ch, CURLOPT_COOKIEJAR, $array['cookiejar']);
53     }
54     if (isset($array['useragent'])) {
55         curl_setopt($ch, CURLOPT_USERAGENT, $array['useragent']);
56     }
57     // 增加https的。不验证证书
58     if ($isHttps) {
59         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
60         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
61     }
62     $html = curl_exec($ch);
63     $r['erro'] = curl_error($ch);
64     $r['errno'] = curl_errno($ch);
65     $r['http_code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
66     $r['html'] = $html;
67     curl_close($ch);
68     return $r;
69 }
70 
71 //样例
72 //self::curl(['url' => 'https://www.baidu.com'], 1, 1);
View Code

 

并发curl

 1 /**
 2  * 并发curl请求
 3  * 具体每个字段的含义可以参考上面的单个方法
 4  *
 5  * @param $params
 6  * @param $timeoutLimit
 7  * @param $connectTimeoutLimit
 8  */
 9 public static function multiCurl($params, $timeoutLimit, $connectTimeoutLimit)
10 {
11     $mch = curl_multi_init();
12     $connArr = [];
13     foreach ($params as $key => $val) {
14         $url = $val['url'];
15         $connArr[$key] = curl_init($url);
16         //设置参数 start
17         if(substr($url,0,5)=='https'){
18             $isHttps = true;
19         }
20         curl_setopt($connArr[$key], CURLOPT_PROXY, $val['proxy']);
21         if(strpos(strtolower($val['proxy_type']), 'so') !== false){
22             curl_setopt($connArr[$key], CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
23         }else{
24             curl_setopt($connArr[$key], CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
25         }
26 //            curl_setopt($connArr[$key], CURLOPT_URL, $val['url']);
27         curl_setopt($connArr[$key], CURLOPT_RETURNTRANSFER, true);
28         curl_setopt($connArr[$key], CURLOPT_TIMEOUT, $timeoutLimit);
29         curl_setopt($connArr[$key], CURLOPT_CONNECTTIMEOUT, $connectTimeoutLimit);
30 
31         if (isset($val['header']) && $val['header']) {
32             curl_setopt($connArr[$key], CURLOPT_HEADER, 1);
33         }
34         if (isset($val['httpheader'])) {
35             curl_setopt($connArr[$key], CURLOPT_HTTPHEADER, $val['httpheader']);
36         }
37         if (isset($val['referer'])) {
38             curl_setopt($connArr[$key], CURLOPT_REFERER, $val['referer']);
39         }
40         if (isset($val['post'])) {
41             curl_setopt($connArr[$key], CURLOPT_POST, 1);
42             curl_setopt($connArr[$key], CURLOPT_POSTFIELDS, $val['post']);
43         }
44         if (isset($val['followlocation'])) {
45             curl_setopt($connArr[$key], CURLOPT_FOLLOWLOCATION, $val['followlocation']);
46         }
47         if (isset($val['cookiefile'])) {
48             curl_setopt($connArr[$key], CURLOPT_COOKIEFILE, $val['cookiefile']);
49         }
50         if (isset($val['cookiejar'])) {
51             curl_setopt($connArr[$key], CURLOPT_COOKIEJAR, $val['cookiejar']);
52         }
53         if (isset($val['useragent'])) {
54             curl_setopt($connArr[$key], CURLOPT_USERAGENT, $val['useragent']);
55         }
56         // 增加https的。
57         if ($isHttps) {
58             curl_setopt($connArr[$key], CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
59             curl_setopt($connArr[$key], CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
60         }
61         //设置参数 end
62         curl_multi_add_handle ($mch, $connArr[$key]); // 添加线程
63     }
64 
65     //执行线程
66     do {
67         $mrc = curl_multi_exec($mch,$active);
68     }while ($mrc == CURLM_CALL_MULTI_PERFORM);
69 
70     while ($active and $mrc == CURLM_OK) {
71         if (curl_multi_select($mch) != -1) {
72             do {
73                 $mrc = curl_multi_exec($mch, $active);
74             } while ($mrc == CURLM_CALL_MULTI_PERFORM);
75         }
76     }
77 
78     //搜集curl信息
79     $arrInfo = [];
80     foreach ($params as $i => $url) {
81         $arrInfo[$i]['html'] = curl_multi_getcontent($connArr[$i]);
82         $curlInfo = curl_getinfo($connArr[$i]);
83         $arrInfo[$i]['total_time'] = $curlInfo['total_time'];
84         $arrInfo[$i]['http_code'] = $curlInfo['http_code'];
85         curl_multi_remove_handle($mch, $connArr[$i]);
86         curl_close($connArr[$i]);
87     }
88     curl_multi_close($mch);
89 
90     return $arrInfo;
91 }
92 
93 //样例
94 //self::multiCurl([['url'=>'https://www.baidu.com'], ['url'=>'https://www.google.com']], 1, 1);
View Code

 

  

对应github项目地址:https://github.com/A07110517/PHP_CURL

posted on 2017-12-06 15:42  asif  阅读(533)  评论(0编辑  收藏  举报

导航