CURL

CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 CURL 库。使用PHP的CURL 库可以简单和有效地去抓网页。
你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。
无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,CURL 是一个功能强大的PHP库。

PHP建立CURL请求的基本步骤

①:初始化

curl_init()

②:设置属性

curl_setopt().有一长串CURL 参数可供设置,它们能指定URL请求的各个细节。

③:执行并获取结果

curl_exec()

④:释放句柄

curl_close()
如果获得的数据时json格式的,使用json_decode函数解释成数组。

$output_array = json_decode($data,true); //如果第二个参数为true,就转为数组的形式。如果不填就为对象的形式

如果使用json_decode($data)解析的话,将会得到object类型的数据。

CURL实现GET和POST

原生的curl

  1     /**
  2      * ①:GET方式实现
  3      * @param  [type] $url       访问的url
  4      * @return [type] [description]
  5      */
  6     public function curl_get($url)
  7     {
  8         //初始化
  9         $curl = curl_init();
 10         //设置抓取的url
 11         curl_setopt($curl, CURLOPT_URL, $url);
 12         //设置头文件的信息作为数据流输出
 13         curl_setopt($curl, CURLOPT_HEADER, 1);
 14         //设置获取的信息以文件流的形式返回,而不是直接输出。
 15         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 16         //执行命令
 17         $data = curl_exec($curl);
 18         //关闭URL请求
 19         curl_close($curl);
 20         //显示获得的数据
 21         print_r($data);
 22         return $data;
 23     }
 24     /**
 25      * ②:POST方式实现
 26      * @param  [type] $url       访问的url
 27      * @param  array  $post_data 设置post数据
 28      * @return [type]            [description]
 29      */
 30     public function curl_post($url,$post_data=array())
 31     {
 32         //初始化:创建一个新cURL资源
 33         $curl = curl_init();
 34         //设置抓取的url
 35         curl_setopt($curl, CURLOPT_URL, $url);
 36         //curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //超时设置,用来告诉 PHP 在成功连接服务器前等待多久(连接成功之后就会开始缓冲输出),这个参数是为了应对目标服务器的过载,下线,或者崩溃等可能状况。
 37         //设置头文件的信息作为数据流输出
 38         //curl_exec()返回值类型:1获取的信息以文件流的形式返回,而不是直接输出。0如果成功只返回TRUE,自动输出返回的内容
 39         curl_setopt($curl, CURLOPT_HEADER, 1);
 40         //设置获取的信息以文件流的形式返回,而不是直接输出。
 41         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 42         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。当CURLOPT_SSL_VERIFYPEER启用,并验证失败,证明证书是真实的,连接失败。当选项为零时,对等证书验证无论如何都成功。
 43         
 44         //设置post数据
 45         // $post_data = array( "username" => "coder", "password" => "12345");
 46         // if (!empty($post_data)) {
 47             //设置post方式提交
 48             curl_setopt($curl, CURLOPT_POST, 1);
 49             curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
 50         // }
 51         //执行命令
 52         $data = curl_exec($curl);
 53         //关闭URL请求
 54         curl_close($curl);
 55         //显示获得的数据
 56         print_r($data);
 57         return $data;
 58     }
 59     /**
 60      * 方法3:
 61      * 参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$cookies
 62      * @param  [type]  $url          访问的URL
 63      * @param  string  $post         post数据(不填则为GET)
 64      * @param  string  $cookie       提交的$cookies
 65      * @param  integer $returnCookie 是否返回$cookies
 66      * @return [type]                [description]
 67      */
 68     public function curl_request($url,$post='',$cookie='', $returnCookie=0){
 69         $curl = curl_init();
 70         curl_setopt($curl, CURLOPT_URL, $url);
 71         curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
 72         curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
 73         curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
 74         curl_setopt($curl, CURLOPT_REFERER, "http://XXX");
 75         if($post) {
 76             curl_setopt($curl, CURLOPT_POST, 1);
 77             curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
 78         }
 79         if($cookie) {
 80             curl_setopt($curl, CURLOPT_COOKIE, $cookie);
 81         }
 82         curl_setopt($curl, CURLOPT_HEADER, $returnCookie);
 83         curl_setopt($curl, CURLOPT_TIMEOUT, 10);
 84         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 85         $data = curl_exec($curl);
 86         if (curl_errno($curl)) {
 87             return curl_error($curl);
 88         }
 89         curl_close($curl);
 90         if($returnCookie){
 91             list($header, $body) = explode("\r\n\r\n", $data, 2);
 92             preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
 93             $info['cookie']  = substr($matches[1][0], 1);
 94             $info['content'] = $body;
 95             return $info;
 96         }else{
 97             return $data;
 98         }
 99     }
100 
101     /**
102      * 方法四:
103      * 获取通过curl 方式获取的数据
104      * @param  [type] $url     访问的URL
105      * @param  array  $options post数据(不填则为GET)
106      * @param  [type] &$httpCode http状态码
107      * @return [type]          [description]
108      */
109     public function req_curl($url, $options = array(), &$httpCode = null)
110     {
111         $res = '';
112         $options = array_merge(array(
113             'follow_local' => true,
114             'timeout' => 30,
115             'max_redirects' => 4,
116             'binary_transfer' => false,
117             'include_header' => false,
118             'no_body' => false,
119             'cookie_location' => dirname(__FILE__) . '/cookie',
120             'useragent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
121             'post' => array() ,
122             'referer' => null,
123             'ssl_verifypeer' => 0,
124             'ssl_verifyhost' => 0,
125             //PHP CURL库默认1024字节的长度不等待数据的返回,所以你那段代码需增加一项配置
126             'headers' => array(
127                 'Expect:'
128             ) ,
129             'auth_name' => '',
130             'auth_pass' => '',
131             'session' => false
132         ) , $options);
133         $options['url'] = $url;
134 
135         $s = curl_init();
136 
137         if (!$s) return false;
138 
139         curl_setopt($s, CURLOPT_URL, $options['url']);
140         curl_setopt($s, CURLOPT_HTTPHEADER, $options['headers']);
141         curl_setopt($s, CURLOPT_SSL_VERIFYPEER, $options['ssl_verifypeer']);
142         curl_setopt($s, CURLOPT_SSL_VERIFYHOST, $options['ssl_verifyhost']);
143         curl_setopt($s, CURLOPT_TIMEOUT, $options['timeout']);
144         curl_setopt($s, CURLOPT_MAXREDIRS, $options['max_redirects']);
145         curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
146         curl_setopt($s, CURLOPT_FOLLOWLOCATION, $options['follow_local']);
147         curl_setopt($s, CURLOPT_COOKIEJAR, $options['cookie_location']);
148         curl_setopt($s, CURLOPT_COOKIEFILE, $options['cookie_location']);
149         if (!empty($options['auth_name']) && is_string($options['auth_name']))
150         {
151             curl_setopt($s, CURLOPT_USERPWD, $options['auth_name'] . ':' . $options['auth_pass']);
152         }
153         if (!empty($options['post']))
154         {
155             curl_setopt($s, CURLOPT_POST, true);
156             curl_setopt($s, CURLOPT_POSTFIELDS, $options['post']);
157             //curl_setopt($s, CURLOPT_POSTFIELDS, array('username' => 'aeon', 'password' => '111111'));
158         }
159         if ($options['include_header'])
160         {
161             curl_setopt($s, CURLOPT_HEADER, true);
162         }
163         if ($options['no_body'])
164         {
165 
166         curl_setopt($s, CURLOPT_NOBODY, true);
167         }
168         if ($options['session'])
169         {
170             curl_setopt($s, CURLOPT_COOKIESESSION, true);
171             curl_setopt($s, CURLOPT_COOKIE, $options['session']);
172         }
173         curl_setopt($s, CURLOPT_USERAGENT, $options['useragent']);
174         curl_setopt($s, CURLOPT_REFERER, $options['referer']);
175         $res = curl_exec($s);
176         $httpCode = curl_getinfo($s, CURLINFO_HTTP_CODE); //最后一个收到的HTTP代码
177         curl_close($s);
178         return $res;
179     }

 

Yii2.0 -- 自带

use linslin\yii2\curl;

$username= 'your name';
$url = 'http://www.localhost.com';
$data = ['username'=>$username];
$curl = new curl\Curl();
$res = $curl->setPostParams($data)->post($url);

var_dump($res);

Yii2.0 自带

use linslin\yii2\curl;

$username= 'your name';

$url = 'http://www.localhost.com?username=' . $username;
$curl = new curl\Curl();
$s = $curl->post($url); // 必须使用 post 提交,协议使用 https,关闭 CURLOPT_SSL_VERIFYPEER 证书
var_dump($s);

Yii2.0 自带(二)

 

posted @ 2018-04-26 20:09  liuweipcs  阅读(158)  评论(0)    收藏  举报