• 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

        ...

      

  • 相关阅读:
    原型设计作业
    20210405-1 案例分析作业
    要命的作业
    20210309-1 准备工作
    20210309-2 阅读任务
    前端用js获取本地文件的内容
    2019春第四周作业
    解决BootStap TreeView插件在 BootStrap4上不兼容问题
    ABP VNEXT使用PUT方法时报”对象已被修改,乐观并发失败“解决方案
    【一步一步入坑ABP VNEXT】安装ABP CLI
  • 原文地址:https://www.cnblogs.com/MyOnlyBook/p/9374783.html
Copyright © 2020-2023  润新知