简介:
curl是一个非常强大的开源库,它支持了很多协议,比如常见的HTTP和FTP。基于curl库,我们可以很方便地和各种协议的server进行connect和communicate。PHP支持libcurl库,所以在php中可以很方便地使用curl库的功能。在日常的工作中,我们最常用到的就是使用curl发送HTTP请求。
基础用法:
php的curl扩展使用非常简单,概括起来只有4步:
<1> 初始化一个curl对象并返回,$ch会作为其他几个函数的必要参数。如果函数出错会返回FALSE:
$ch = curl_init();
<2> 给curl对象设置一些参数,为运行做准备。比如传入url,或者传入需要post的数据,设置timeout等等。成功返回TRUE,失败返回FALSE:
curl_setopt($ch, KEY, VALUE);
<3> 执行并获取结果,这个函数返回值如官网上描述:Returns TRUE
on success or FALSE
on failure. However, if the CURLOPT_RETURNTRANSFER
option is set, it will return the result on success, FALSE
on failure.
curl_exec($ch);
<4> 关闭curl对象。curl对象本身会占用一些资源,如果不关闭会造成内存泄漏。而且在使用HTTP协议时,默认是长连接,如果不关闭curl对象,连接会一直打开。对于client,最终会因为连接数超过了限制而无法再发送请求。对于server,可用连接数被多个client耗尽,导致停止对外提供服务。
curl_close($ch);
常用的参数设置:
<1> CURLOPT_URL
需要访问的url,也可以在curl_init()函数中直接传入。
<2> CURLOPT_HEADER
设置为TRUE的时候,会输出HTTP头文件信息。调试代码的时候可以设置为TRUE,一般设置为FALSE。
<3> CURLOPT_POST
设置为TRUE时,会发送POST请求。
<4> CURLOPT_POSTFIELDS
这个参数在POST的时候使用。VALUE一般传一个数组就可以了。文件可以通过CURLFile发送。
<5> CURLOPT_RETURNTRANSFER
curl_exec 函数默认是把执行结果直接输出来。我们平时编写代码更想把结果存储在一个字符串中,然后做后续的处理。如果把CURLOPT_RETURNTRANSFER设置为TRUE,那么就可以用 $res=curl_exec($ch)的方式获取了。
<6> CURLOPT_TIMEOUT
一个HTTP调用可能需要很长的时间去执行,可以使用此参数设置timeout。参数描述:The maximum number of seconds to allow cURL functions to execute.
<7> CURLOPT_FOLLOWLOCATION
如果设置为TRUE,那么执行过程中会根据server返回的HTTP头中的“Location:”进行重定向。这里是无限制递归的,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。这个参数写爬虫的时候要注意,使用不当就形成环了。
<8> CURLOPT_CONNECTTIMEOUT
The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
POST数据时应该注意的问题:
当我们使用curl post数据时,主流的Content-Type有以下3种:
a. application/x-www-form-urlencoded
b. multipart/form-data
c. application/json
当CURLOPT_POSTFIELDS是一个字符串时,Content-Type就是application/x-www-form-urlencoded。
当CURLOPT_POSTFIELDS是一个数组时,Content-Type就是multipart/form-data。这里有2个特别坑爹的地方不得不强调。第一个是POST的这个数组只能是一维数组,多维数组会报错。第二个是,如果POST的数据是个数组时,curl_setopt($ch, CURLOPT_POST, 1)这行代码 必须在放在这行代码curl_setopt($ch, CURLOPT_POSTFIELDS, $data)之前。就是这个错误浪费了我一下午的时间,最后抓包才把这个问题给抓出来的。
如果想要传递json字符串,则需要手动设置HANDER中的Ceontent-Type为application/json。
错误检测:
<1> curl_errno($ch), Returns the error number for the last cURL operation.返回0则说明没有错误发生,返回非零则说明出错。
<2> curl_error($ch), Return a string containing the last error for the current session, 返回空字符串,则说明没有错误发生。否则就是错误原因字符串。
<3> curl_getinfo($ch), 可以得到如下数据:
url
content_type
http_code
total_time
...