php使用curl总结

简介:

  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, FALSEon 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

    ...

  

原文地址:https://www.cnblogs.com/MyOnlyBook/p/9374783.html