cURL是一个非常强大的工具,它支持多种多样的协议(HTTP,FTP,TELNET等等)进行数据传输.因而cURL不受限于它能干什么,不管是基本的HTTP请求还是复杂的FTP上传或者是与需要验证处理的HTTPS网站进行交互,cURL都可以胜任。PHP通过cURL函数库对cURL提供了支持,下面主要介绍PHP cURL中使用最频繁的GET、POST方法和返回数据的处理,以及一些有用的cURL设置项。
基本
在我们通过cURL请求进行各样操作之前,首先我们需要初始化一个cURL的实例对象,我们可以通过调用curl_init()这个方法来完成,它返回一个cURL的句柄。该方法提供一个可选参数,可以通过该参数设置要发送请求的URL地址,在此我们先不传参,下面会用另一种方式进行设置。
设置
当我们拿到cURL的句柄后,我们就可以对其进行一系列的参数设定,下面是一些主要的设置项:
CURLOPT_RETURNTRANSFER
true:将返回的数据以文件流的形式返回;false:将返回的数据直接输出显示;
CURLOPT_CONNECTTIMEOUT
发起连接时等待的时间(秒);
CURLOPT_TIMEOUT
请求超时时间(秒);
CURLOPT_USERAGENT
设置请求的用户代理;
CURLOPT_URL
设置请求的URL地址
CURLOPT_POST
是否以POST方式发起请求
CURLOPT_POSTFIELDS
POST参数值
我们可以通过调用curl_setopt()方法设定指定的cURL参数值,该方法接收三个参数,分别是cURL句柄、设置项(例如CURLOPT_URL)和设置值。
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://hejunhao.me'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5);
当我们需要设置大量参数时,显然重复使用大量curl_setopt并不方便,我们可以通过curl_setopt_array(),一次性设置大量参数。
<?php $ch = curl_init(); $options = array( CURLOPT_URL => 'http://hejunhao.me', CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => true, CURLOPT_NOPROGRESS => False, CURLOPT_TIMEOUT => 5 ); curl_setopt_array($ch, $options);
发送请求
当我们设置好所有参数,准备发起请求时,我们通过调用curl_exec()方法来执行我们的请求,该方法接收一个cURL句柄参数。请求执行后会有三种可能的返回情况:
false :请求执行时产生某种错误
true :CURLOPT_RETURNTRANSFER 为 false,且请求执行中未产生任何错误,请求结果直接输出显示
result:CURLOPT_RETURNTRANSFER 为 true,且未产生任何错误,则返回执行结果(JSON、string、HTML…)
关闭请求
当请求执行完后,我们需要关闭该请求,以释放系统资源,通过调用curl_close()方法实现,该方法接收一个cURL句柄作为参数。
GET请求
由于GET是默认的请求方法,因而通过cURL执行GET请求只需要将查询语句拼接到URL中,然后设置CURLOPT_URL项即可
<?php //获取cURL句柄 $ch = curl_init(); //GET请求的URL $url = 'http://test.com/?param1=value1¶m2=value2¶m3=value3'; //设置请求URL curl_setopt($ch, CURLOPT_URL, $url); //可选 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //可选 curl_setopt($ch, CURLOPT_TIMEOUT, 30); //可选 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //可选 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); //发起请求并把返回数据保存在$result $result = curl_exec($ch); //关闭请求,释放资源 curl_close($ch);
POST请求
POST方法和GET方法的区别只有一两处,首先需要把CURLOPT_POST设为true,如果你需要发送一些数据,只需要通过CURLOPT_POSTFIELDS设置你要传递的数据即可,上面的GET请求改为POST请求如下:
<?php //获取cURL句柄 $ch = curl_init(); //GET请求的URL $url = 'http://test.com'; $data = array( 'param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3' ); //设置请求URL curl_setopt($ch, CURLOPT_URL, $url); //设置以POST方法请求 curl_setopt($ch, CURLOPT_POST, true); //传递POST参数 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //可选 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //可选 curl_setopt($ch, CURLOPT_TIMEOUT, 30); //可选 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //可选 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); //发起请求并把返回数据保存在$result $result = curl_exec($ch); //关闭请求,释放资源 curl_close($ch);
请求错误
我们都很讨厌错误的产生,而执行请求时难免会产生一些不可以预知的错误,为了能够了解请求所产生的错误,我们需要对cURL请求进行错误捕捉,主要通过以下两个方法:
curl_error(): 返回一个包含错误信息的字符串,如果没有错误产生则返回一个空字符串。
curl_errno: 返回cURL错误码,请参考cURL错误码对照
<?php $ch = curl_init('http://testerror.com'); if(!curl_exec($ch)){ die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch)); } curl_close($ch); /****输出**** Error: "Could not resolve host: testerror.com" - Code: 6 ************/