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的access操作类
Apr 09 PHP
php adodb介绍
Mar 19 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
关于crontab的使用详解
Jun 24 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
php 流程控制switch的简单实例
Jun 07 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
php cookie 详解使用实例
Nov 03 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 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生成PDF方法详解
2015/01/23 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
node.js实现带进度条的多文件上传
2020/03/27 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
Python读写Excel文件的实例
2013/11/01 Python
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
使用python接入微信聊天机器人
2020/03/31 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
工作作风承诺书
2014/08/30 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
努力学习保证书
2015/02/26 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
MySQL Server 层四个日志
2022/03/31 MySQL
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技