PHP中的使用curl发送请求(GET请求和POST请求)


Posted in PHP onFebruary 08, 2017

使用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.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的官方网站(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下实现伪 url 的超简单方法[转]
Sep 24 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
基于Zookeeper的使用详解
May 02 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
Jun 06 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
php中的explode()函数实例介绍
Jan 18 PHP
php制作基于xml的RSS订阅源功能示例
Feb 08 #PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 #PHP
php实现XML和数组的相互转化功能示例
Feb 08 #PHP
PHP 获取指定地区的天气实例代码
Feb 08 #PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 #PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 #PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 #PHP
You might like
php discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php实现等比例压缩图片
2018/07/26 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
匹配任意字符的正则表达式写法
2010/04/29 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
工程预算与管理应届生求职信
2013/10/06 职场文书
演讲主持词
2014/03/18 职场文书
新闻编辑求职信
2014/04/09 职场文书
员工试用期自我评价
2014/09/18 职场文书
社区敬老月活动总结
2015/05/07 职场文书
神秘岛读书笔记
2015/07/01 职场文书
解除租赁合同协议书
2016/03/21 职场文书
Python3 类型标注支持操作
2021/06/02 Python