cURL 函数
在线手册:中文  英文

curl_getinfo

(PHP 4 >= 4.0.4, PHP 5)

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

说明

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

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

参数

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):

更新日志

版本 说明
5.1.3 引入CURLINFO_HEADER_OUT.

范例

Example #1 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.


cURL 函数
在线手册:中文  英文

用户评论:

nikita dot bulatenko at gmail dot com (2013-03-15 14:11:33)

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

vince (2010-10-22 16:56:49)

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($cCURLINFO_HTTP_CODE) === '200') echo "CURLINFO_HTTP_CODE returns a string.";
    if(
curl_getinfo($cCURLINFO_HTTP_CODE) === 200) echo "CURLINFO_HTTP_CODE returns an integer.";
    
curl_close($c);
?>

returns

"CURLINFO_HTTP_CODE returns an integer."

Anonymous (2010-07-20 14:53:05)

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.

raghuveer at spiderace dot com (2008-10-23 05:47:11)

A code snippet that I had attempted to enumerate the Remote File Size and to post Amount of Time taken for that particular Curl Request.

<?php

/* borrowed the Byte Conversion code (byte_convert function) posted by "olafurw at gmail.com" and modified by "d.abromeit" in http://in.php.net/filesize. I did make changes in the notation of expression of multiples of bytes from KiB => KB, MiB => MB etc all symbols in this Byte Code*/

  
function byte_convert($bytes)
  {
    
$symbol = array('B''KB''MB''GB''TB''PB''EB''ZB''YB');

    
$exp 0;
    
$converted_value 0;
    if( 
$bytes )
    {
      
$exp floorlog($bytes)/log(1024) );
      
$converted_value = ( $bytes/pow(1024,floor($exp)) );
    }

    return 
sprintf'%.2f '.$symbol[$exp], $converted_value );
  }

   
$userAgent 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
   
$url 'http://www.spiderace.com/samplefiles/testfile.zip';

    
// initialize curl with given url
    
$ch curl_init($url);
    
// make sure we get the header
    
curl_setopt($chCURLOPT_HEADER1);
    
// make it a http HEAD request
    
curl_setopt($chCURLOPT_NOBODY1);
    
// add useragent
    
curl_setopt($chCURLOPT_USERAGENT$userAgent);
    
//Tell curl to write the response to a variable
    
curl_setopt($chCURLOPT_RETURNTRANSFER1);
    
// The maximum number of seconds to allow cURL functions to execute. 
    
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,60);
    
// Tell curl to stop when it encounters an error 
    
curl_setopt($chCURLOPT_FAILONERROR1);
    
    
$execute curl_exec($ch);
    
    
// Check if any error occured
    
if(!curl_errno($ch))
    {
        
$bytes curl_getinfo($chCURLINFO_CONTENT_LENGTH_DOWNLOAD);
        
// Display the File Size
        
echo byte_convert($bytes);
        echo 
"<br><br>";
        
$total_time curl_getinfo($chCURLINFO_TOTAL_TIME);
        echo 
'Took ' $total_time ' seconds to send a request to ' $url;
        
clearstatcache();
    }
    
curl_close($ch);

?>

NOTE: This code worked on Both Linux (tried on CentOS) & Windows Servers (tried on XAMPP For Windows on Windows XP PC), thank you. Hope this will be helpful to others as well.

master-No-sp-aM at io dot ua (2008-07-17 00:40:59)

CURLINFO_CONTENT_LENGTH_DOWNLOAD contains zero in FTP request although Content-Length field is present.

Following workaround may helps:

<?php
$ch 
curl_init($url);
... 
CURL OPTIONS ...
$result=curl_exec($ch);
$pu=parse_url($url);
if(
$pu['scheme']=='ftp'){
    
$regexp="/Content-Length: (\d*)/";
    
preg_match($regexp,$result,$matches);
    
$con_len=$matches[1];
}
else 
$con_len curl_getinfo($chCURLINFO_CONTENT_LENGTH_DOWNLOAD);
?>

Its worth to keep using CURLINFO_CONTENT_LENGTH_DOWNLOAD in http requests, becouse there could be several headers pack if CURLOPT_FOLLOWLOCATION is fired, and regular expression for this case is a little bit complicated.

nemetral (2008-06-17 07:57:16)

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.

luiheidsgoeroe at hotmail dot com (2008-02-04 15:02:09)

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($chCURLOPT_URL"http://www.example.com/");
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>

This works:
<?php
$ch 
curl_init();
curl_setopt($chCURLOPT_URL"http://www.example.com/");
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLINFO_HEADER_OUTtrue);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>

Mark Evers (2008-01-16 22:14:10)

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.

ssttoo at hotmail dot com (2004-04-06 12:13:09)

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($chCURLOPT_URL,            "http://mail.yahoo.com");
$ret curl_setopt($chCURLOPT_HEADER,         1);
$ret curl_setopt($chCURLOPT_FOLLOWLOCATION1);
$ret curl_setopt($chCURLOPT_RETURNTRANSFER0);
$ret curl_setopt($chCURLOPT_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']];
    }

}
?>

易百教程