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 相关文章推荐
php实现jQuery扩展函数
Oct 30 PHP
兼容firefox,chrome的网页灰度效果
Aug 08 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
destoon整合UCenter图文教程
Jun 21 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
php远程下载类分享
Apr 13 PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 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
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Python configparser模块应用过程解析
2020/08/14 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
质检员工作总结2015
2015/04/25 职场文书
nginx lua 操作 mysql
2022/05/15 Servers
Go语言测试库testify使用学习
2022/07/23 Golang