日志

PHP中使用cURL请求

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

************/
转载请注明出处:

© http://hejunhao.me