用来采集网络中的html网页文件、其他做事器供应接口数据等
开启curl扩展
(1) 在php.ini里面开启curl这个扩展
(2) 将PHP的安装路径保存到环境变量的系统变量中(环境变量之间的分隔符是英文的分号)
(3) 重启apache做事器
(4) 重启打算机
curl的一些常用配置项
(1) 通过CURLOPT_RETURNTRANSFER配置项设置,是直接显示结果(echo)还是将结果返回(return)
(2) 针对https协议的要求,须要验证客户真个安全证书,常日都会跳过安全证书的验证
(3) CURLOPT_HEADER是否返回header头信息
封装的一个curl方法1:
<?php/ 利用curl扩展发出http的get或post要求 /class HttpRequest{ //url,要求的做事器地址 private $url = ''; //is_return,是否返回结果而不是直接显示 private $is_return = 1; public function __set($p,$v){ if(property_exists($this, $p)){ $this->$p = $v; } } // 发出http要求的方法 //参数:提交的数据,默认是空的 public function send($data = array()){ //1. 如果通报数据了,解释向做事器提交数据(post),如果没有通报数据,认为从做事器读取资源(get) $ch = curl_init(); //2. 不管是get、post,跳过证书的验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //3. 设置要求的做事器地址 curl_setopt($ch, CURLOPT_URL, $this->url); //4. 判断是get还是post if(!empty($data)){ curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } //5. 是否返回数据 if($this->is_return===1){ //解释返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); return $result; }else{ //直接输出 curl_exec($ch); curl_close($ch); } }}
封装的一个curl方法2:
//curl采集器public function http_curl($url,$type='get',$res='json',$arr=''){ //1.初始化curl$ch=curl_init(); //2.设置curl的参数 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); if($type=='post'){ curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$arr); } //3.采集 $output=curl_exec($ch); //4.关闭 curl_close($ch); //如果返回的值,是json格式,则转换成数组 if($res=='json'){ if(curl_errno($ch)){ //要求失落败,返回缺点信息 return curl_error($ch); }else{ //要求成功 return json_decode($output,true); } } }//http_curl end
curl仿照文件上传
解释:PHP5.6之前的版本上传文件利用:@
Php5.6之后的版本利用new CURLFile()
这样其他做事器吸收到数据之后,就可以移动了
curl仿照cookie登录
(1) 我们访问做事器时,做事器会先在做事器端创建一个session文件,保存用户的信息,便于在多个页面共享数据,然后做事器会以setcookie的形式见告客户端在自己身上创建cookie,保存session文件的名,以前利用浏览器访问做事器的时候,浏览器会在自己身上创建cookie文件,现在利用我们的做事器访问:cookie保存到哪里?
CURLOPT_COOKIEJAR配置项设置,cookie保存到哪里
(2) 往后再访问做事器的时候,随身携带cookie(里面便是存储的session文件的名字),那么怎么找到这个cookie呢?
CURLOPT_COOKIEFILE 配置项设置,每次要求时携带哪个cookie文件
PHP利用CURL详解
CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们利用它来发送HTTP要求。它给我 们带来的好处是可以通过灵巧的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
利用CURL发送要求的基本流程
利用CURL的PHP扩展完成一个HTTP要求的发送一样平常有以下几个步骤:
初始化连接句柄;设置CURL选项;实行并获取结果;开释VURL连接句柄。下面的程序片段是利用CURL发送HTTP的范例过程
// 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL,"http://www.devdo.net"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); // 3. 实行并获取HTML文档内容 $output = curl_exec($ch); if($output === FALSE ){ echo "CURL Error:".curl_error($ch); } // 4. 开释curl句柄 curl_close($ch);
上述代码中利用到了四个函数
①curl_init() 和 curl_close() 分别是初始化CURL连接和关闭CURL连接,都比较大略。
②curl_exec() 实行CURL要求,如果没有缺点发生,该函数的返回是对应URL返回的数据,以字符串表示满意;如果发生缺点,该函数返回 FALSE。须要把稳的是,判断输出是否为FALSE用的是全等号,这是为了区分返回空串和出错的情形。
③CURL函数库里最主要的函数是curl_setopt(),它可以通过设定CURL函数库定义的选项来定制HTTP要求。上述代码片段中利用了三个主要的选项:
CURLOPT_URL 指定要求的URL;CURLOPT_RETURNTRANSFER 设置为1表示稍后实行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;CURLLOPT_HEADER设置为0表示不返回HTTP头部信息。CURL的选项还有很多,可以到PHP的官方网站上查看CURL支持的所有选项列表。
获取CURL要求的输出信息
在curl_exec()函数实行之后,可以利用curl_getinfo()函数获取CURL要求输出的干系信息,示例代码如下:
curl_exec($ch);$info = curl_getinfo($sh);echo ' 获取 '.$info['url'].'耗时'.$info['total_time'].'秒';
上述代码中curl_getinfo返回的是一个关联数组,包含以下数据:
url:网络地址。content_type:内容编码。http_code:HTTP状态码。header_size:header的大小。request_size:要求的大小。filetime:文件创建的韶光。ssl_verify_result:SSL验证结果。redirect_count:跳转计数。total_time:总耗时。namelookup_time:DNS查询耗时。connect_time:等待连接耗时。pretransfer_time:传输前准备耗时。size_uplpad:上传数据的大小。size_download:下载数据的大小。speed_download:下载速率。speed_upload:上传速率。download_content_length:下载内容的长度。upload_content_length:上传内容的长度。starttransfer_time:开始传输的韶光表。redirect_time:重定向耗时。curl_getinfo()函数还有一个可选择参数$opt,通过这个参数可以设置一些常量,对应到上述这个字段,如果设置了第二个参数,那么返回的只有指定的信息。例如设置$opt为CURLINFO_TOTAL_TIME,则curl_getinfo()函数只返回total_time,即总传输花费的韶光,在只须要关注某些传输信息时,设置$opt参数很故意义。
利用CURL发送GET要求
如何利用CURL来发送GET要求,发送GET要求的关键是拼装格式精确的URL。要求地址和GET数据由一个“?”分割,然后GET变量的名称和值用“=”分隔,各个GET名称和值由“&”连接。PHP为我们供应了一个函数专门用来拼装GET要乞降数据部分——http_build_query,该函数接管一个关联数组,返回由该关联数据描述的GET要求字符串。利用这个函数,结合CURL发送HTTP要求的一样平常流程,我们封闭了一个发送GET要求的函数——doCurlGetRequest,详细代码如下:
@desc 封闭curl的调用接口,get的要求办法。/function doCurlGetRequest($url,$data,$timeout = 5){ if($curl == "" || $timeout <= 0){ return false; } $url = $url.'?'.http_bulid_query($data); $con = curl_init((string)$url); curl_setopt($con, CURLOPT_HEADER, false); curl_setopt($con, CURLOPT_RETURNTRANSFER,true); curl_setopt($con, CURLOPT_TIMEOUT, (int)$timeout); return curl_exec($con);}
这个函数把利用http_build_query 拼装好的带GET参数的URL传给curl_init函数,然后利用CURL发送HTTP要求。
利用CURL发送POST要求
可以利用CURL供应的选项CURLOPT_POSTFIELDS,设置该选项为POST字符串数据就可以把要求放在正文中。同样我们实现了一个发送POST要求的函数——doCurlPostRequest,代码如下:
/ @desc 封装 curl 的调用接口,post的要求办法/function doCurlPostRequest($url,$requestString,$timeout = 5){ if($url == '' || $requestString == '' || $timeout <=0){ return false; } $con = curl_init((string)$url); curl_setopt($con, CURLOPT_HEADER, false); curl_setopt($con, CURLOPT_POSTFIELDS, $requestString); curl_setopt($con, CURLOPT_POST,true); curl_setopt($con, CURLOPT_RETURNTRANSFER,true); curl_setopt($con, CURLOPT_TIMEOUT,(int)$timeout); return curl_exec($con);}
上面代码中除了设置CURLOPT_POSTFIELDS外,我们还设置了CURL_POST为true,标识这个要求是一个POST要求。在POST要求中也是可以传输GET数据的,只须要在URL中拼装GET要求数据即可。
领取办法:点赞关注领取办法:点赞关注小编后私信【资料】获取资料领取办法!