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."
curl_getinfo
(PHP 4 >= 4.0.4, PHP 5)
curl_getinfo — 获取一个cURL连接资源句柄的信息
参数
-
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.
|
范例
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.
vince
22-Oct-2010 04:56
Anonymous
20-Jul-2010 02:53
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
23-Oct-2008 05:47
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 > 0 )
{
$exp = floor( log($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($ch, CURLOPT_HEADER, 1);
// make it a http HEAD request
curl_setopt($ch, CURLOPT_NOBODY, 1);
// add useragent
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
//Tell curl to write the response to a variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 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($ch, CURLOPT_FAILONERROR, 1);
$execute = curl_exec($ch);
// Check if any error occured
if(!curl_errno($ch))
{
$bytes = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
// Display the File Size
echo byte_convert($bytes);
echo "<br><br>";
$total_time = curl_getinfo($ch, CURLINFO_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
17-Jul-2008 12:40
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($ch, CURLINFO_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
17-Jun-2008 07:57
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
04-Feb-2008 03:02
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));
?>
Mark Evers
16-Jan-2008 10:14
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
06-Apr-2004 12:13
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']];
}
}
?>
