page contents

PHP使用CURL详解

curl是PHP的一个扩展,利用该扩展可以实现服务器之间的数据或文件传输。也就是说curl就是一个工具,用来做服务器之间数据、文件传输的工具。

attachments-2020-11-EBnSkUit5fa8b2278f12d.png

curl是PHP的一个扩展,利用该扩展可以实现服务器之间的数据或文件传输。也就是说curl就是一个工具,用来做服务器之间数据、文件传输的工具。

attachments-2020-11-48w8CVmo5fa8b23746150.png

用来采集网络中的html网页文件、其他服务器提供接口数据等


开启curl扩展

(1) 在php.ini里面开启curl这个扩展

(2) 将PHP的安装路径保存到环境变量的系统变量中(环境变量之间的分隔符是英文的分号)

(3) 重启apache服务器

(4) 重启计算机


curl的一些常用配置项

(1) 通过CURLOPT_RETURNTRANSFER配置项设置,是直接显示结果(echo)还是将结果返回(return)

attachments-2020-11-nvDgx2X65fa8b24ca97fb.png

(2) 针对https协议的请求,需要验证客户端的安全证书,通常都会跳过安全证书的验证

attachments-2020-11-NrpPkx4u5fa8b258614a0.png

(3) CURLOPT_HEADER是否返回header头信息

attachments-2020-11-pDt5MEsU5fa8b264b106b.png


封装的一个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()

attachments-2020-11-YFLvr9f85fa8b28116984.png

这样其他服务器接收到数据之后,就可以移动了

attachments-2020-11-OGTdDJov5fa8b28c5f87b.png


curl模拟cookie登录

(1) 我们访问服务器时,服务器会先在服务器端创建一个session文件,保存用户的信息,便于在多个页面共享数据,然后服务器会以setcookie的形式告诉客户端在自己身上创建cookie,保存session文件的名,以前使用浏览器访问服务器的时候,浏览器会在自己身上创建cookie文件,现在使用我们的服务器访问:cookie保存到哪里?


CURLOPT_COOKIEJAR配置项设置,cookie保存到哪里

attachments-2020-11-XORzGm1n5fa8b2b0c3b9e.png

(2) 以后再访问服务器的时候,随身携带cookie(里面就是存储的session文件的名字),那么怎么找到这个cookie呢?

attachments-2020-11-bnYyRADq5fa8b2c2d6f1d.png

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,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请求数据即可。


attachments-2020-11-3ss2Emwo5fa8b2daa22ff.jpg来源:https://www.cnblogs.com/lxj0205/p/9360826.html

  • 发表于 2020-11-09 11:05
  • 阅读 ( 442 )
  • 分类:开发环境

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1320 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章