• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • curl_getinfo()

    (PHP 4 >= 4.0.4, PHP 5, PHP 7)

    获取一个cURL连接资源句柄的信息

    说明

    curl_getinfo(resource $ch[,int $opt= 0]): mixed

    获取最后一次传输的相关信息。

    参数

    $ch

    由curl_init()返回的 cURL 句柄。

    $opt

    这个参数可能是以下常量之一:

    • CURLINFO_EFFECTIVE_URL- 最后一个有效的URL地址
    • CURLINFO_HTTP_CODE- 最后一个收到的HTTP代码
    • CURLINFO_FILETIME- 远程获取文档的时间,如果无法获取,则返回值为“-1”
    • CURLINFO_TOTAL_TIME- 最后一次传输所消耗的时间
    • CURLINFO_NAMELOOKUP_TIME- 名称解析所消耗的时间
    • CURLINFO_CONNECT_TIME- 建立连接所消耗的时间
    • CURLINFO_PRETRANSFER_TIME- 从建立连接到准备传输所使用的时间
    • CURLINFO_STARTTRANSFER_TIME- 从建立连接到传输开始所使用的时间
    • CURLINFO_REDIRECT_TIME- 在事务传输开始前重定向所使用的时间
    • CURLINFO_SIZE_UPLOAD- 以字节为单位返回上传数据量的总值
    • CURLINFO_SIZE_DOWNLOAD- 以字节为单位返回下载数据量的总值
    • CURLINFO_SPEED_DOWNLOAD- 平均下载速度
    • CURLINFO_SPEED_UPLOAD- 平均上传速度
    • CURLINFO_HEADER_SIZE- header部分的大小
    • CURLINFO_HEADER_OUT- 发送请求的字符串
    • CURLINFO_REQUEST_SIZE- 在HTTP请求中有问题的请求的大小
    • CURLINFO_SSL_VERIFYRESULT- 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD- 从Content-Length:field中读取的下载内容长度
    • CURLINFO_CONTENT_LENGTH_UPLOAD- 上传内容大小的说明
    • CURLINFO_CONTENT_TYPE- 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type:header

    返回值

    如果$opt被设置,以字符串形式返回它的值。否则,返回返回一个包含下列元素的关联数组(它们分别对应于$opt):

    • "url"
    • "content_type"
    • "http_code"
    • "header_size"
    • "request_size"
    • "filetime"
    • "ssl_verify_result"
    • "redirect_count"
    • "total_time"
    • "namelookup_time"
    • "connect_time"
    • "pretransfer_time"
    • "size_upload"
    • "size_download"
    • "speed_download"
    • "speed_upload"
    • "download_content_length"
    • "upload_content_length"
    • "starttransfer_time"
    • "redirect_time"

    更新日志

    版本说明
    5.1.3引入CURLINFO_HEADER_OUT.

    范例

    curl_getinfo() example

    <?php
    // 创建一个cURL句柄
    $ch = curl_init('http://www.yahoo.com/');
    // 执行
    curl_exec($ch);
    // 检查是否有错误发生
    if(!curl_errno($ch))
    {
     $info = curl_getinfo($ch);
     echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
    }
    // Close handle
    curl_close($ch);
    ?>
    

    注释

    Note:

    Information gathered by this function is kept if the handle is re-used. This means that unless a statistic is overridden internally by this function, the previous info is returned.

    Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to 'http_code' index of the arrray returned by curl_getinfo(). 
    These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
    http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    [Informational 1xx]
    100="Continue"
    101="Switching Protocols"
    [Successful 2xx]
    200="OK"
    201="Created"
    202="Accepted"
    203="Non-Authoritative Information"
    204="No Content"
    205="Reset Content"
    206="Partial Content"
    [Redirection 3xx]
    300="Multiple Choices"
    301="Moved Permanently"
    302="Found"
    303="See Other"
    304="Not Modified"
    305="Use Proxy"
    306="(Unused)"
    307="Temporary Redirect"
    [Client Error 4xx]
    400="Bad Request"
    401="Unauthorized"
    402="Payment Required"
    403="Forbidden"
    404="Not Found"
    405="Method Not Allowed"
    406="Not Acceptable"
    407="Proxy Authentication Required"
    408="Request Timeout"
    409="Conflict"
    410="Gone"
    411="Length Required"
    412="Precondition Failed"
    413="Request Entity Too Large"
    414="Request-URI Too Long"
    415="Unsupported Media Type"
    416="Requested Range Not Satisfiable"
    417="Expectation Failed"
    [Server Error 5xx]
    500="Internal Server Error"
    501="Not Implemented"
    502="Bad Gateway"
    503="Service Unavailable"
    504="Gateway Timeout"
    505="HTTP Version Not Supported"
    And an example usage:
    <?php
    $ch = curl_init(); // create cURL handle (ch)
    if (!$ch) {
      die("Couldn't initialize a cURL handle");
    }
    // set some cURL options
    $ret = curl_setopt($ch, CURLOPT_URL,      "http://mail.yahoo.com");
    $ret = curl_setopt($ch, CURLOPT_HEADER,     1);
    $ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
    $ret = curl_setopt($ch, CURLOPT_TIMEOUT,    30);
    // execute
    $ret = curl_exec($ch);
    if (empty($ret)) {
      // some kind of an error happened
      die(curl_error($ch));
      curl_close($ch); // close cURL handler
    } else {
      $info = curl_getinfo($ch);
      curl_close($ch); // close cURL handler
      if (empty($info['http_code'])) {
          die("No HTTP code was returned"); 
      } else {
        // load the HTTP codes
        $http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");
        
        // echo results
        echo "The server responded: <br />";
        echo $info['http_code'] . " " . $http_codes[$info['http_code']];
      }
    }
    ?>
    
    Here you have a function that I use to get the content of a URL using cURL. This uses curl_getinfo to know if it is a regular URL or maybe a redirection.
    I hope it would be useful for you:
    function getUrlContent($url){
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
     curl_setopt($ch, CURLOPT_TIMEOUT, 5);
     $data = curl_exec($ch);
     $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
     curl_close($ch);
     return ($httpcode>=200 && $httpcode<300) ? $data : false;
    }
    The source comes from this website:
    http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
    CURLINFO_SSL_VERIFYRESULT error codes:
    0: ok the operation was successful. 
    2 : unable to get issuer certificate
    3: unable to get certificate CRL
    4: unable to decrypt certificate's signature
    5: unable to decrypt CRL's signature
    6: unable to decode issuer public key
    7: certificate signature failure
    8: CRL signature failure
    9: certificate is not yet valid
    10: certificate has expired
    11: CRL is not yet valid
    12:CRL has expired
    13: format error in certificate's notBefore field
    14: format error in certificate's notAfter field
    15: format error in CRL's lastUpdate field
    16: format error in CRL's nextUpdate field
    17: out of memory
    18: self signed certificate
    19: self signed certificate in certificate chain
    20: unable to get local issuer certificate
    21:unable to verify the first certificate
    22: certificate chain too long
    23: certificate revoked
    24: invalid CA certificate
    25: path length constraint exceeded
    26: unsupported certificate purpose
    27: certificate not trusted
    28: certificate rejected
    29: subject issuer mismatch
    30: authority and subject key identifier mismatch
    31: authority and issuer serial number mismatch
    32: key usage does not include certificate signing
    50: application verification failure
    details at http://www.openssl.org/docs/apps/verify.html#VERIFY_OPERATION
    CURLINFO_HTTP_CODE does not return a string, as the docs say, but rather an integer.
    <?php
      $c = curl_init('http://www.example.com/');
      if(curl_getinfo($c, CURLINFO_HTTP_CODE) === '200') echo "CURLINFO_HTTP_CODE returns a string.";
      if(curl_getinfo($c, CURLINFO_HTTP_CODE) === 200) echo "CURLINFO_HTTP_CODE returns an integer.";
      curl_close($c);
    ?>
    returns
    "CURLINFO_HTTP_CODE returns an integer."
    Just a quick note: if you want to use curl_getinfo() with option CURLINFO_HEADER_OUT in order to debug your cURL request, you must add curl_setopt($handle, CURLINFO_HEADER_OUT, true); first while specifying the options.
    There is a constant missing from that list. CURLINFO_REDIRECT_COUNT will give you the number of redirects it went through if CURLOPT_FOLLOWLOCATION was set.
    curl_getinfo($ch) will also return 'redirect_url' if there is one (even if CURLOPT_FOLLOWLOCATION set to false).
    I don't know why it's not in the doc..
    Note, header_size include "\r\n\r\n". So if you use CURLOPT_FOLLOWLOCATION>0, CURLOPT_HEADER=true, CURLOPT_RETURNTRANSFER=true right way splite header/body:
    $response = curl_exec($ch);
    $curl_info = curl_getinfo($ch);
    curl_close($ch);
    $header_size = $curl_info['header_size'];
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);
    If you call curl_reset() on a handle that has already been passed to curl_exec(), and then perform a curl_getinfo() on the same handle, you may expect that you get the same result as if you called curl_getinfo() immediately after curl_init(). This is not the case, however. cURL will return the data from the previous execution. If you want to completely reset you actually need to unset the cURL handle and recreate a new one.
    The main doc neglects to mention that when the CURLINFO_HEADER_OUT option is set the array returned by this function will included a new property, request_header, that is a string of the headers sent in the request.
    If you use curl option CURLOPT_NOBODY = true to test if distant url is available, any sites can send you an http code 400 like Cdiscount Wsdl : 
    $ch = @curl_init($wsdl);
    if($ch === false)
      return false;
        
    @curl_setopt($ch, CURLOPT_HEADER     ,true);  // we want headers
    @curl_setopt($ch, CURLOPT_NOBODY     ,true);  // dont need body
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);  // catch output (do NOT print!)
    @curl_exec($ch);
    if(@curl_errno($ch)){  // should be 0
      @curl_close($ch);
      return false;
    }
    $code = @curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    Modifying CURLOPT_NOBODY to false, http code sent is 200 otherwise http code is 400 !!!
    Keep in mind that for CURLOPT_RETURNTRANSFER it has to be set with curl_setopt() before execution:
    This doesn't work:
    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
    ?>
    This works:
    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    curl_exec($ch);
    var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
    ?>
    
    Example 1 should use "if(curl_errno($ch))" not "if(!curl_errno($ch))"

    上篇:curl_file_create()

    下篇:curl_init()