PHP CURL使用详解


Posted in PHP onMarch 21, 2019

PHP CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

使用CURL发送请求的基本流程

使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

  • 1、初始化连接句柄;
  • 2、设置CURL选项;
  • 3、执行并获取结果;
  • 4、释放VURL连接句柄。

下面的程序片段是使用CURL发送HTTP的典型过程

// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.codetc.com");
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的官方网站(http://www.php.net/manual/en/function.curl-setopt.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请求数据即可秀。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
PHP制作万年历
Jan 07 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
php时间戳转换代码详解
Aug 04 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 #PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 #PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 #PHP
启用OPCache提高PHP程序性能的方法
Mar 21 #PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 #PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 #PHP
PHP实现的数据对象映射模式详解
Mar 20 #PHP
You might like
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
HTML的select控件美化
2017/03/27 Javascript
js读取本地文件的实例
2017/12/22 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
python 默认参数问题的陷阱
2016/02/29 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python中set()函数简介及实例解析
2018/01/09 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
数控加工专业毕业生自荐信
2013/09/27 职场文书
语文教学感言
2014/02/06 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
建国大业观后感
2015/06/01 职场文书
学雷锋广播稿大全
2015/08/19 职场文书