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 — Возвращает информацию об определенной операции
Описание
Возвращает информацию о последней операции.
Список параметров
-
ch -
Дескриптор cURL, полученный из curl_init().
-
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- Суммарный размер всех полученных заголовков -
CURLINFO_HEADER_OUT- Посылаемая строка запроса. Для работы этого параметра, добавьте опциюCURLINFO_HEADER_OUTк дескриптору с помощью вызова curl_setopt() -
CURLINFO_REQUEST_SIZE- Суммарный размер всех отправленных запросов, в настоящее время используется только для HTTP запросов -
CURLINFO_SSL_VERIFYRESULT- Результат проверки SSL сертификата, запрошенной с помощью установки параметраCURLOPT_SSL_VERIFYPEER -
CURLINFO_CONTENT_LENGTH_DOWNLOAD- размер скачанных данных, прочитанный из заголовка Content-Length: -
CURLINFO_CONTENT_LENGTH_UPLOAD- Размер закачиваемых данных -
CURLINFO_CONTENT_TYPE- Содержимое полученного заголовка Content-Type:, или NULL, если сервер не послал правильный заголовок Content-Type:
-
Возвращаемые значения
Если параметр opt указан, то возвращается его
значение в виде строки. Иначе, возвращается ассоциативный массив со
следующими индексами (которые соответствуют значениям аргумента
opt), или FALSE в случае ошибки:
- "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"
- "certinfo"
-
"request_header" (Это возвращается только при установленной
опции
CURLINFO_HEADER_OUTс помощью вызова curl_setopt() до выполнения запроса)
Список изменений
| Версия | Описание |
|---|---|
| 5.1.3 |
Добавлена константа CURLINFO_HEADER_OUT.
|
Примеры
Пример #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 'Прошло ' . $info['total_time'] . ' секунд во время запроса к ' . $info['url'];
}
// Close handle
curl_close($ch);
?>
Примечания
Замечание:
Информация, собранная этой функцией, будет сохранена при дальнейшем использовании дескриптора. Это означает, что если статистика не будет перезаписана самой функцией, будет возвращаться информация по предыдущему запросу.
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.
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.
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.
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.
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));
?>
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.
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']];
}
}
?>
