备注:使用curl_init函数,必须要打开这个php扩展。
1.打开php.ini,开启extension=php_curl.dll
2.检查php.ini的extension_dir值是哪个目录,检查有无php_curl.dll,没有的请下载php_curl.dll,再把php目录中的libeay32.dll,ssleay32.dll拷到c:/windows/system32里面。
最近在学习腾讯开放平台API接口的过程中,看到了一个很强大的PHP库——cURL。它是利用URL语法在命令行方式下工作的文件传输工具。这篇文章是博主直接从国外一个博客翻译过来的,原文地址是:http://codular.com/curl-with-php。这篇文章讲的很基础,但条理很清晰,知识比较系统和全面,所以转过来收藏了!(下面的有些标题是博主画蛇添足的,大家近乎可以忽略。)
1 定义:什么是cURL
cURL允许数据传输跨广泛的协议,是一个非常强大的系统。它广泛用于跨网站发送数据,包括诸如API交互和oAuth。cURL是在它的应用范围内几乎是无所不能的,从基本的HTTP请求,到更为复杂的FTP上传或封闭式HTTPS网站的交互验证。让我们一起来看看发送一个GET和POST请求和处理返回的响应的简单区别,以及一些重要的参数说明。
在我们通过一个cURL请求做任何事之前,我们首先需要初始化一个cURL的实例。我们可以通过调用函数curl_init()函数实现,它会返回一个cURL资源。该函数接收你想要发送的请求URL作为它的一个参数。在本文中,我们先不做这一步,可以在接下来的过程中用另一种方式来实现它。
2 须知:一些核心设置
一旦我们得到了一个cURL资源,我们可以开始进行一些配置,下面列出我总结的一些核心设置。
CURLOPT_RETURNTRANSFER - 返回响应作为一个字符串,而不是输出到屏幕
CURLOPT_CONNECTTIMEOUT - 连接超时的时间
CURLOPT_TIMEOUT - cURL执行的超时时间
CURLOPT_USERAGENT - 用于请求的Useragent字符串
CURLOPT_URL - 发送请求的URL对象
CURLOPT_POST - 以POST方式发送一个请求
CURLOPT_POSTFIELDS - 在POST提交的请求中的数组数据
3 创建一个配置
我们可以通过使用curl_setopt()方式创建一个配置,这个方式接受3个参数:cURL资源、设置以及设置对应的值。因此,我们可以如下所示设置我们正在发送的请求URL。
代码如下 | 复制代码 |
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://www.111cn.net'); |
如上所示,当获取cURL资源时,我们可以通过传送一个参数来设置URL。
代码如下 | 复制代码 |
$curl = curl_init('http://www.111cn.net'); |
当然我们也可以通过给curl_setopt_array()函数传递一个包含变量名和变量值的数组一次性地创建多重配置。
代码如下 | 复制代码 |
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://www.111cn.net' )); |
4 执行请求:curl_exec()
当所有选项都配置好后,准备发送请求时,我们可以通过调用curl_exec()方式来执行这个cURL请求。这个函数将会返回三种不同的情形:
代码如下 | 复制代码 |
$result = curl_exec($curl); |
此时,$result已经包含了页面的响应——它可能是JSON,一个字符串或者一个完整的网站的HTML。
5 关闭请求:curl_close()
当你发送完一个请求并且获取到了相应的返回结果,你就需要关闭这个cURL请求以便释放一些系统资源。通过调用curl_close()方法,我们可以像其它所有需要将资源作为参数的函数一样简单实现资源的释放。
6 GET请求
GET请求是默认的请求方法,并且我们可以很直截了当的使用它。事实上所有的例子到目前为止一直都是GET请求。如果你想在请求中加入传入一些参数,那么你可以像http://testcURL.com/?item1=value&item2=value2一样把这些参数作为一个查询字符串附加在URL地址后面。
因此,我们可以通过如下示例发送一个GET请求到上面的URL中去,并且返回相应的结果。
代码如下 | 复制代码 |
// Get cURL resource $curl = curl_init(); // Set some options - we are passing in a useragent too here curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testcURL.com/?item1=value&item2=value2', CURLOPT_USERAGENT => 'Codular Sample cURL Request' )); // Send the request & save response to $resp $resp = curl_exec($curl); // Close request to clear up some resources curl_close($curl); |
7 POST请求
GET请求和POST请求两者之间语法的唯一区别就是:在你想要传送一些数据时,多了一个设置。我们将把CURLOPT_POST设置为true,并且通过设置CURLOPT_POSTFIELDS来传送包含一个数组的数据。
因此,如果把上面的GET请求转换为POST请求,我们可以使用下面的代码:
代码如下 | 复制代码 |
// Get cURL resource $curl = curl_init(); // Set some options - we are passing in a useragent too here curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://www.111cn.net', CURLOPT_USERAGENT => 'Codular Sample cURL Request', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => array( item1 => 'value', item2 => 'value2' ) )); // Send the request & save response to $resp $resp = curl_exec($curl); // Close request to clear up some resources curl_close($curl); |
到这里,你就拥有了这样的一个POST请求:它将产生和上面GET请求一样的效果,并且把返回数据到脚本中,这样你就可以随便使用它们了。
发起https请求示例
代码如下 | 复制代码 |
function _https_curl_post($url, $vars) { foreach($vars as $key=>$value) { $fields_string .= $key.'='.$value.'&' ; } $fields_string = substr($fields_string,0,(strlen($fields_string)-1)) ; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // this line makes it work under https curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST, count($vars) ); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); $data = curl_exec($ch); curl_close($ch); if ($data) { return $data; } else { return false; } } |
8 错误
尽管我们讨厌错误,但是你还是得注意使用cURL时可能出现的情形。因为你最终无法控制你所发送请求的网站,也无法保证该站点的响应结果将会是你预想的那种方式以及这个站点一直都会是正常状态。
这里提供了两个可以用来处理错误的函数:
curl_error() - 返回一个字符串错误信息(当请求正常返回时,其值为空)
curl_errno() - 返回cURL的错误数目,然后你可以查看这个包含错误代码的页面。
例如,你可以如下示例使用:
代码如下 | 复制代码 |
if(!curl_exec($curl)){ die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); } |
如果你想要任何HTTP响应代码都大于400来产生一个错误,而不是返回整个HTML页面,那么你可以把CURLOPT_FAILONERROR设置为true。cURL是一个“庞然大物”,并且还有很多很多的可能。有些网站可能为一些用户代理提供服务页面,当使用API接口时,它们可能会要求你传送一个特别的用户代理,这些都是我们需要注意的。如果你还想了解一些cURL请求,为何不尝试去oAuth with Instagram看看呢?