(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
curl_error — Возвращает строку с описанием последней ошибки текущего сеанса
Описание
Список параметров
-
handle -
Дескриптор cURL, полученный из curl_init().
Возвращаемые значения
Возвращает сообщение об ошибке или '' (пустую строку),
если ошибки не произошло.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
handle теперь ожидает экземпляр CurlHandle;раньше, ожидался ресурс (resource). |
Примеры
Пример #1 Пример использования curl_error()
<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(
curl_exec($ch) === false)
{
echo 'Ошибка curl: ' . curl_error($ch);
}
else
{
echo 'Операция завершена без каких-либо ошибок';
}// Закрываем дескриптор
curl_close($ch);
?>
patrick at ibuildings dot nl ¶
9 years ago
If you want to fetch the error message, make sure you fetch it before you close the current cURL session or the error message will be reset to an empty string.
paul at paulmcgarry dot com ¶
14 years ago
For a 404 response to actually trigger an error as the example seems to be trying to demonstrate the following option should be set:
curl_setopt($ch,CURLOPT_FAILONERROR,true);
As per http://curl.haxx.se/libcurl/c/libcurl-errors.html
CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. (This error code was formerly known as CURLE_HTTP_NOT_FOUND.)
anrdaemon at freemail dot ru ¶
3 years ago
curl_error is not a textual representation of curl_errno.
It's an actual error *message*.
If you want textual representation of error *code*, look for curl_strerror.
Anonymous ¶
2 years ago
If you're using curl_multi and there's an error, curl_error() will remain empty until you've called curl_multi_info_read(). That function "pumps" the information inside the curl libraries to the point where curl_error() will return a useful string.
This should really be added to the documentation, because it's not at all obvious.
(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
curl_errno — Возвращает код последней ошибки
Описание
Список параметров
-
handle -
Дескриптор cURL, полученный из curl_init().
Возвращаемые значения
Возвращает номер ошибки или 0 (ноль), если
ошибки не произошло.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 |
handle теперь ожидает экземпляр CurlHandle;раньше, ожидался ресурс (resource). |
Примеры
Пример #1 Пример использования curl_errno()
<?php
// Создаём дескриптор curl к несуществующему адресу
$ch = curl_init('http://404.php.net/');// Запускаем
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);// Проверяем наличие ошибки
if(curl_errno($ch))
{
echo 'Ошибка curl: ' . curl_error($ch);
}// Закрываем дескриптор
curl_close($ch);
?>
denis at reddodo dot com ¶
11 years ago
if someone need more information about curl errors
<?php
$error_codes=array(
[1] => 'CURLE_UNSUPPORTED_PROTOCOL',
[2] => 'CURLE_FAILED_INIT',
[3] => 'CURLE_URL_MALFORMAT',
[4] => 'CURLE_URL_MALFORMAT_USER',
[5] => 'CURLE_COULDNT_RESOLVE_PROXY',
[6] => 'CURLE_COULDNT_RESOLVE_HOST',
[7] => 'CURLE_COULDNT_CONNECT',
[8] => 'CURLE_FTP_WEIRD_SERVER_REPLY',
[9] => 'CURLE_REMOTE_ACCESS_DENIED',
[11] => 'CURLE_FTP_WEIRD_PASS_REPLY',
[13] => 'CURLE_FTP_WEIRD_PASV_REPLY',
[14]=>'CURLE_FTP_WEIRD_227_FORMAT',
[15] => 'CURLE_FTP_CANT_GET_HOST',
[17] => 'CURLE_FTP_COULDNT_SET_TYPE',
[18] => 'CURLE_PARTIAL_FILE',
[19] => 'CURLE_FTP_COULDNT_RETR_FILE',
[21] => 'CURLE_QUOTE_ERROR',
[22] => 'CURLE_HTTP_RETURNED_ERROR',
[23] => 'CURLE_WRITE_ERROR',
[25] => 'CURLE_UPLOAD_FAILED',
[26] => 'CURLE_READ_ERROR',
[27] => 'CURLE_OUT_OF_MEMORY',
[28] => 'CURLE_OPERATION_TIMEDOUT',
[30] => 'CURLE_FTP_PORT_FAILED',
[31] => 'CURLE_FTP_COULDNT_USE_REST',
[33] => 'CURLE_RANGE_ERROR',
[34] => 'CURLE_HTTP_POST_ERROR',
[35] => 'CURLE_SSL_CONNECT_ERROR',
[36] => 'CURLE_BAD_DOWNLOAD_RESUME',
[37] => 'CURLE_FILE_COULDNT_READ_FILE',
[38] => 'CURLE_LDAP_CANNOT_BIND',
[39] => 'CURLE_LDAP_SEARCH_FAILED',
[41] => 'CURLE_FUNCTION_NOT_FOUND',
[42] => 'CURLE_ABORTED_BY_CALLBACK',
[43] => 'CURLE_BAD_FUNCTION_ARGUMENT',
[45] => 'CURLE_INTERFACE_FAILED',
[47] => 'CURLE_TOO_MANY_REDIRECTS',
[48] => 'CURLE_UNKNOWN_TELNET_OPTION',
[49] => 'CURLE_TELNET_OPTION_SYNTAX',
[51] => 'CURLE_PEER_FAILED_VERIFICATION',
[52] => 'CURLE_GOT_NOTHING',
[53] => 'CURLE_SSL_ENGINE_NOTFOUND',
[54] => 'CURLE_SSL_ENGINE_SETFAILED',
[55] => 'CURLE_SEND_ERROR',
[56] => 'CURLE_RECV_ERROR',
[58] => 'CURLE_SSL_CERTPROBLEM',
[59] => 'CURLE_SSL_CIPHER',
[60] => 'CURLE_SSL_CACERT',
[61] => 'CURLE_BAD_CONTENT_ENCODING',
[62] => 'CURLE_LDAP_INVALID_URL',
[63] => 'CURLE_FILESIZE_EXCEEDED',
[64] => 'CURLE_USE_SSL_FAILED',
[65] => 'CURLE_SEND_FAIL_REWIND',
[66] => 'CURLE_SSL_ENGINE_INITFAILED',
[67] => 'CURLE_LOGIN_DENIED',
[68] => 'CURLE_TFTP_NOTFOUND',
[69] => 'CURLE_TFTP_PERM',
[70] => 'CURLE_REMOTE_DISK_FULL',
[71] => 'CURLE_TFTP_ILLEGAL',
[72] => 'CURLE_TFTP_UNKNOWNID',
[73] => 'CURLE_REMOTE_FILE_EXISTS',
[74] => 'CURLE_TFTP_NOSUCHUSER',
[75] => 'CURLE_CONV_FAILED',
[76] => 'CURLE_CONV_REQD',
[77] => 'CURLE_SSL_CACERT_BADFILE',
[78] => 'CURLE_REMOTE_FILE_NOT_FOUND',
[79] => 'CURLE_SSH',
[80] => 'CURLE_SSL_SHUTDOWN_FAILED',
[81] => 'CURLE_AGAIN',
[82] => 'CURLE_SSL_CRL_BADFILE',
[83] => 'CURLE_SSL_ISSUER_ERROR',
[84] => 'CURLE_FTP_PRET_FAILED',
[84] => 'CURLE_FTP_PRET_FAILED',
[85] => 'CURLE_RTSP_CSEQ_ERROR',
[86] => 'CURLE_RTSP_SESSION_ERROR',
[87] => 'CURLE_FTP_BAD_FILE_LIST',
[88] => 'CURLE_CHUNK_FAILED');?>
nimasdj AT yahoo [DOT] com ¶
7 years ago
To coder.ua[at]gmail.com:
Please note some errors have more than one constants:
[CURLE_FTP_PARTIAL_FILE] 18
[CURLE_PARTIAL_FILE] 18
[CURLE_HTTP_NOT_FOUND] 22
[CURLE_HTTP_RETURNED_ERROR] 22
[CURLE_OPERATION_TIMEDOUT] 28
[CURLE_OPERATION_TIMEOUTED] 28
[CURLE_BAD_DOWNLOAD_RESUME] 36
[CURLE_FTP_BAD_DOWNLOAD_RESUME] 36
bozo_z_clown at yahoo dot com ¶
13 years ago
Note that you can detect errors using curl_multi_info_read() in the curl_multi_exec() loop that don't show up later using curl_errno(). This seems particularly true of connection errors.
cubefox at web dot NOSPAMPLEASE dot de ¶
2 years ago
The manual above only mentions how to get an error description from the cURL handle ($ch) using curl_error():
<?php
$description = curl_error($ch);
?>
But you can also get a description from the error number itself using curl_strerror():
<?php
$description = curl_strerror(curl_errno($ch));
?>
The latter can be useful if you only have access to the error number but not to the cURL handle.
coder.ua[at]gmail.com ¶
10 years ago
All available curl error constants and values in PHP 5.4.7 on FreeBSD 8.2-RELEASE:
CURLE_UNSUPPORTED_PROTOCOL => 1
CURLE_FAILED_INIT => 2
CURLE_URL_MALFORMAT => 3
CURLE_URL_MALFORMAT_USER => 4
CURLE_COULDNT_RESOLVE_PROXY => 5
CURLE_COULDNT_RESOLVE_HOST => 6
CURLE_COULDNT_CONNECT => 7
CURLE_FTP_WEIRD_SERVER_REPLY => 8
CURLE_FTP_ACCESS_DENIED => 9
CURLE_FTP_USER_PASSWORD_INCORRECT => 10
CURLE_FTP_WEIRD_PASS_REPLY => 11
CURLE_FTP_WEIRD_USER_REPLY => 12
CURLE_FTP_WEIRD_PASV_REPLY => 13
CURLE_FTP_WEIRD_227_FORMAT => 14
CURLE_FTP_CANT_GET_HOST => 15
CURLE_FTP_CANT_RECONNECT => 16
CURLE_FTP_COULDNT_SET_BINARY => 17
CURLE_PARTIAL_FILE => 18
CURLE_FTP_COULDNT_RETR_FILE => 19
CURLE_FTP_WRITE_ERROR => 20
CURLE_FTP_QUOTE_ERROR => 21
CURLE_HTTP_NOT_FOUND => 22
CURLE_WRITE_ERROR => 23
CURLE_MALFORMAT_USER => 24
CURLE_FTP_COULDNT_STOR_FILE => 25
CURLE_READ_ERROR => 26
CURLE_OUT_OF_MEMORY => 27
CURLE_OPERATION_TIMEOUTED => 28
CURLE_FTP_COULDNT_SET_ASCII => 29
CURLE_FTP_PORT_FAILED => 30
CURLE_FTP_COULDNT_USE_REST => 31
CURLE_FTP_COULDNT_GET_SIZE => 32
CURLE_HTTP_RANGE_ERROR => 33
CURLE_HTTP_POST_ERROR => 34
CURLE_SSL_CONNECT_ERROR => 35
CURLE_FTP_BAD_DOWNLOAD_RESUME => 36
CURLE_FILE_COULDNT_READ_FILE => 37
CURLE_LDAP_CANNOT_BIND => 38
CURLE_LDAP_SEARCH_FAILED => 39
CURLE_LIBRARY_NOT_FOUND => 40
CURLE_FUNCTION_NOT_FOUND => 41
CURLE_ABORTED_BY_CALLBACK => 42
CURLE_BAD_FUNCTION_ARGUMENT => 43
CURLE_BAD_CALLING_ORDER => 44
CURLE_HTTP_PORT_FAILED => 45
CURLE_BAD_PASSWORD_ENTERED => 46
CURLE_TOO_MANY_REDIRECTS => 47
CURLE_UNKNOWN_TELNET_OPTION => 48
CURLE_TELNET_OPTION_SYNTAX => 49
CURLE_OBSOLETE => 50
CURLE_SSL_PEER_CERTIFICATE => 51
CURLE_GOT_NOTHING => 52
CURLE_SSL_ENGINE_NOTFOUND => 53
CURLE_SSL_ENGINE_SETFAILED => 54
CURLE_SEND_ERROR => 55
CURLE_RECV_ERROR => 56
CURLE_SHARE_IN_USE => 57
CURLE_SSL_CERTPROBLEM => 58
CURLE_SSL_CIPHER => 59
CURLE_SSL_CACERT => 60
CURLE_BAD_CONTENT_ENCODING => 61
CURLE_LDAP_INVALID_URL => 62
CURLE_FILESIZE_EXCEEDED => 63
CURLE_FTP_SSL_FAILED] => 64
david at liip dot ch ¶
11 years ago
you should look on http://php.net/manual/en/curl.constants.php for the error codes, not on the linked official curl doc. some of the error codes are different, at least the one mentioned on the other page:
in PHP the curl error number 28 is called
CURLE_OPERATION_TIMEOUTED
while in the official site is:
CURLE_OPERATION_TIMEDOUT
gmail@asmqb7 ¶
3 years ago
/! ATTENTION if you are using curl multi handles
This function returns 0 in error conditions when run on curl handles accessed via curl_multi_info_read().
You must look at the data returned by curl_multi_info_read() for the true errno. The data is over there instead.
Eugene Kunkel ¶
6 years ago
Gets a current list of all CURLE_* error constants, their applicable error messages, and their applicable error codes. Useful for making wrapper classes or for mapping cURL errors to specific Exception objects.
<?php
$list
= get_defined_constants(TRUE);
$list = preg_grep('/^CURLE_/', array_flip($list['curl']));
$result = array();
foreach (
$list as $const) {
$result[$const] = array
(
'code' => constant($const),
'message' => curl_strerror(constant($const))
);
}
echo
"<pre>";
echo print_r($result, TRUE);
echo "</pre>";
Jacques Manukyan ¶
15 years ago
The error codes come directly from the curl source code. Specifically, look at the curl.h file and it will tell you exactly what each returned code does.
Most of these codes are cryptic but at least you can get a clue as to what the errors are.
Here is a quick snippet of what the errors in the curl.h look like:
CURLE_OK = 0,
CURLE_UNSUPPORTED_PROTOCOL, /* 1 */
CURLE_FAILED_INIT, /* 2 */
CURLE_URL_MALFORMAT, /* 3 */
CURLE_URL_MALFORMAT_USER, /* 4 - NOT USED */
CURLE_COULDNT_RESOLVE_PROXY, /* 5 */
CURLE_COULDNT_RESOLVE_HOST, /* 6 */
CURLE_COULDNT_CONNECT, /* 7 */
CURLE_FTP_WEIRD_SERVER_REPLY, /* 8 */
Note that code 0 means its not an error, it means success.
Содержание
- curl_error
- Description
- Parameters
- Return Values
- Changelog
- Examples
- See Also
- User Contributed Notes 4 notes
- curl_errno
- Description
- Parameters
- Return Values
- Changelog
- Examples
- See Also
- User Contributed Notes 10 notes
- curl_getinfo
- Description
- Parameters
- Return Values
- Changelog
- Examples
- Notes
- User Contributed Notes 12 notes
curl_error
(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
curl_error — Return a string containing the last error for the current session
Description
Returns a clear text error message for the last cURL operation.
Parameters
A cURL handle returned by curl_init() .
Return Values
Returns the error message or » (the empty string) if no error occurred.
Changelog
| Version | Description |
|---|---|
| 8.0.0 | handle expects a CurlHandle instance now; previously, a resource was expected. |
Examples
Example #1 curl_error() example
// Create a curl handle to a non-existing location
$ch = curl_init ( ‘http://404.php.net/’ );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
if( curl_exec ( $ch ) === false )
<
echo ‘Curl error: ‘ . curl_error ( $ch );
>
else
<
echo ‘Operation completed without any errors’ ;
>
// Close handle
curl_close ( $ch );
?>
See Also
User Contributed Notes 4 notes
For a 404 response to actually trigger an error as the example seems to be trying to demonstrate the following option should be set:
CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server returns an error code that is >= 400. (This error code was formerly known as CURLE_HTTP_NOT_FOUND.)
If you’re using curl_multi and there’s an error, curl_error() will remain empty until you’ve called curl_multi_info_read(). That function «pumps» the information inside the curl libraries to the point where curl_error() will return a useful string.
This should really be added to the documentation, because it’s not at all obvious.
Источник
curl_errno
(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
curl_errno — Return the last error number
Description
Returns the error number for the last cURL operation.
Parameters
A cURL handle returned by curl_init() .
Return Values
Returns the error number or 0 (zero) if no error occurred.
Changelog
| Version | Description |
|---|---|
| 8.0.0 | handle expects a CurlHandle instance now; previously, a resource was expected. |
Examples
Example #1 curl_errno() example
// Create a curl handle to a non-existing location
$ch = curl_init ( ‘http://404.php.net/’ );
// Execute
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_exec ( $ch );
// Check if any error occurred
if( curl_errno ( $ch ))
<
echo ‘Curl error: ‘ . curl_error ( $ch );
>
// Close handle
curl_close ( $ch );
?>
See Also
- curl_error() — Return a string containing the last error for the current session
- » Curl error codes
User Contributed Notes 10 notes
if someone need more information about curl errors
=array(
[ 1 ] => ‘CURLE_UNSUPPORTED_PROTOCOL’ ,
[ 2 ] => ‘CURLE_FAILED_INIT’ ,
[ 3 ] => ‘CURLE_URL_MALFORMAT’ ,
[ 4 ] => ‘CURLE_URL_MALFORMAT_USER’ ,
[ 5 ] => ‘CURLE_COULDNT_RESOLVE_PROXY’ ,
[ 6 ] => ‘CURLE_COULDNT_RESOLVE_HOST’ ,
[ 7 ] => ‘CURLE_COULDNT_CONNECT’ ,
[ 8 ] => ‘CURLE_FTP_WEIRD_SERVER_REPLY’ ,
[ 9 ] => ‘CURLE_REMOTE_ACCESS_DENIED’ ,
[ 11 ] => ‘CURLE_FTP_WEIRD_PASS_REPLY’ ,
[ 13 ] => ‘CURLE_FTP_WEIRD_PASV_REPLY’ ,
[ 14 ]=> ‘CURLE_FTP_WEIRD_227_FORMAT’ ,
[ 15 ] => ‘CURLE_FTP_CANT_GET_HOST’ ,
[ 17 ] => ‘CURLE_FTP_COULDNT_SET_TYPE’ ,
[ 18 ] => ‘CURLE_PARTIAL_FILE’ ,
[ 19 ] => ‘CURLE_FTP_COULDNT_RETR_FILE’ ,
[ 21 ] => ‘CURLE_QUOTE_ERROR’ ,
[ 22 ] => ‘CURLE_HTTP_RETURNED_ERROR’ ,
[ 23 ] => ‘CURLE_WRITE_ERROR’ ,
[ 25 ] => ‘CURLE_UPLOAD_FAILED’ ,
[ 26 ] => ‘CURLE_READ_ERROR’ ,
[ 27 ] => ‘CURLE_OUT_OF_MEMORY’ ,
[ 28 ] => ‘CURLE_OPERATION_TIMEDOUT’ ,
[ 30 ] => ‘CURLE_FTP_PORT_FAILED’ ,
[ 31 ] => ‘CURLE_FTP_COULDNT_USE_REST’ ,
[ 33 ] => ‘CURLE_RANGE_ERROR’ ,
[ 34 ] => ‘CURLE_HTTP_POST_ERROR’ ,
[ 35 ] => ‘CURLE_SSL_CONNECT_ERROR’ ,
[ 36 ] => ‘CURLE_BAD_DOWNLOAD_RESUME’ ,
[ 37 ] => ‘CURLE_FILE_COULDNT_READ_FILE’ ,
[ 38 ] => ‘CURLE_LDAP_CANNOT_BIND’ ,
[ 39 ] => ‘CURLE_LDAP_SEARCH_FAILED’ ,
[ 41 ] => ‘CURLE_FUNCTION_NOT_FOUND’ ,
[ 42 ] => ‘CURLE_ABORTED_BY_CALLBACK’ ,
[ 43 ] => ‘CURLE_BAD_FUNCTION_ARGUMENT’ ,
[ 45 ] => ‘CURLE_INTERFACE_FAILED’ ,
[ 47 ] => ‘CURLE_TOO_MANY_REDIRECTS’ ,
[ 48 ] => ‘CURLE_UNKNOWN_TELNET_OPTION’ ,
[ 49 ] => ‘CURLE_TELNET_OPTION_SYNTAX’ ,
[ 51 ] => ‘CURLE_PEER_FAILED_VERIFICATION’ ,
[ 52 ] => ‘CURLE_GOT_NOTHING’ ,
[ 53 ] => ‘CURLE_SSL_ENGINE_NOTFOUND’ ,
[ 54 ] => ‘CURLE_SSL_ENGINE_SETFAILED’ ,
[ 55 ] => ‘CURLE_SEND_ERROR’ ,
[ 56 ] => ‘CURLE_RECV_ERROR’ ,
[ 58 ] => ‘CURLE_SSL_CERTPROBLEM’ ,
[ 59 ] => ‘CURLE_SSL_CIPHER’ ,
[ 60 ] => ‘CURLE_SSL_CACERT’ ,
[ 61 ] => ‘CURLE_BAD_CONTENT_ENCODING’ ,
[ 62 ] => ‘CURLE_LDAP_INVALID_URL’ ,
[ 63 ] => ‘CURLE_FILESIZE_EXCEEDED’ ,
[ 64 ] => ‘CURLE_USE_SSL_FAILED’ ,
[ 65 ] => ‘CURLE_SEND_FAIL_REWIND’ ,
[ 66 ] => ‘CURLE_SSL_ENGINE_INITFAILED’ ,
[ 67 ] => ‘CURLE_LOGIN_DENIED’ ,
[ 68 ] => ‘CURLE_TFTP_NOTFOUND’ ,
[ 69 ] => ‘CURLE_TFTP_PERM’ ,
[ 70 ] => ‘CURLE_REMOTE_DISK_FULL’ ,
[ 71 ] => ‘CURLE_TFTP_ILLEGAL’ ,
[ 72 ] => ‘CURLE_TFTP_UNKNOWNID’ ,
[ 73 ] => ‘CURLE_REMOTE_FILE_EXISTS’ ,
[ 74 ] => ‘CURLE_TFTP_NOSUCHUSER’ ,
[ 75 ] => ‘CURLE_CONV_FAILED’ ,
[ 76 ] => ‘CURLE_CONV_REQD’ ,
[ 77 ] => ‘CURLE_SSL_CACERT_BADFILE’ ,
[ 78 ] => ‘CURLE_REMOTE_FILE_NOT_FOUND’ ,
[ 79 ] => ‘CURLE_SSH’ ,
[ 80 ] => ‘CURLE_SSL_SHUTDOWN_FAILED’ ,
[ 81 ] => ‘CURLE_AGAIN’ ,
[ 82 ] => ‘CURLE_SSL_CRL_BADFILE’ ,
[ 83 ] => ‘CURLE_SSL_ISSUER_ERROR’ ,
[ 84 ] => ‘CURLE_FTP_PRET_FAILED’ ,
[ 84 ] => ‘CURLE_FTP_PRET_FAILED’ ,
[ 85 ] => ‘CURLE_RTSP_CSEQ_ERROR’ ,
[ 86 ] => ‘CURLE_RTSP_SESSION_ERROR’ ,
[ 87 ] => ‘CURLE_FTP_BAD_FILE_LIST’ ,
[ 88 ] => ‘CURLE_CHUNK_FAILED’ );
Источник
curl_getinfo
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
curl_getinfo — Get information regarding a specific transfer
Description
Gets information about the last transfer.
Parameters
A cURL handle returned by curl_init() .
This may be one of the following constants:
- CURLINFO_EFFECTIVE_URL — Last effective URL
- CURLINFO_HTTP_CODE — The last response code. As of cURL 7.10.8, this is a legacy alias of CURLINFO_RESPONSE_CODE
- CURLINFO_FILETIME — Remote time of the retrieved document, with the CURLOPT_FILETIME enabled; if -1 is returned the time of the document is unknown
- CURLINFO_TOTAL_TIME — Total transaction time in seconds for last transfer
- CURLINFO_NAMELOOKUP_TIME — Time in seconds until name resolving was complete
- CURLINFO_CONNECT_TIME — Time in seconds it took to establish the connection
- CURLINFO_PRETRANSFER_TIME — Time in seconds from start until just before file transfer begins
- CURLINFO_STARTTRANSFER_TIME — Time in seconds until the first byte is about to be transferred
- CURLINFO_REDIRECT_COUNT — Number of redirects, with the CURLOPT_FOLLOWLOCATION option enabled
- CURLINFO_REDIRECT_TIME — Time in seconds of all redirection steps before final transaction was started, with the CURLOPT_FOLLOWLOCATION option enabled
- CURLINFO_REDIRECT_URL — With the CURLOPT_FOLLOWLOCATION option disabled: redirect URL found in the last transaction, that should be requested manually next. With the CURLOPT_FOLLOWLOCATION option enabled: this is empty. The redirect URL in this case is available in CURLINFO_EFFECTIVE_URL
- CURLINFO_PRIMARY_IP — IP address of the most recent connection
- CURLINFO_PRIMARY_PORT — Destination port of the most recent connection
- CURLINFO_LOCAL_IP — Local (source) IP address of the most recent connection
- CURLINFO_LOCAL_PORT — Local (source) port of the most recent connection
- CURLINFO_SIZE_UPLOAD — Total number of bytes uploaded
- CURLINFO_SIZE_DOWNLOAD — Total number of bytes downloaded
- CURLINFO_SPEED_DOWNLOAD — Average download speed
- CURLINFO_SPEED_UPLOAD — Average upload speed
- CURLINFO_HEADER_SIZE — Total size of all headers received
- CURLINFO_HEADER_OUT — The request string sent. For this to work, add the CURLINFO_HEADER_OUT option to the handle by calling curl_setopt()
- CURLINFO_REQUEST_SIZE — Total size of issued requests, currently only for HTTP requests
- CURLINFO_SSL_VERIFYRESULT — Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER
- CURLINFO_CONTENT_LENGTH_DOWNLOAD — Content length of download, read from Content-Length: field
- CURLINFO_CONTENT_LENGTH_UPLOAD — Specified size of upload
- CURLINFO_CONTENT_TYPE — Content-Type: of the requested document. NULL indicates server did not send valid Content-Type: header
- CURLINFO_PRIVATE — Private data associated with this cURL handle, previously set with the CURLOPT_PRIVATE option of curl_setopt()
- CURLINFO_RESPONSE_CODE — The last response code
- CURLINFO_HTTP_CONNECTCODE — The CONNECT response code
- CURLINFO_HTTPAUTH_AVAIL — Bitmask indicating the authentication method(s) available according to the previous response
- CURLINFO_PROXYAUTH_AVAIL — Bitmask indicating the proxy authentication method(s) available according to the previous response
- CURLINFO_OS_ERRNO — Errno from a connect failure. The number is OS and system specific.
- CURLINFO_NUM_CONNECTS — Number of connections curl had to create to achieve the previous transfer
- CURLINFO_SSL_ENGINES — OpenSSL crypto-engines supported
- CURLINFO_COOKIELIST — All known cookies
- CURLINFO_FTP_ENTRY_PATH — Entry path in FTP server
- CURLINFO_APPCONNECT_TIME — Time in seconds it took from the start until the SSL/SSH connect/handshake to the remote host was completed
- CURLINFO_CERTINFO — TLS certificate chain
- CURLINFO_CONDITION_UNMET — Info on unmet time conditional
- CURLINFO_RTSP_CLIENT_CSEQ — Next RTSP client CSeq
- CURLINFO_RTSP_CSEQ_RECV — Recently received CSeq
- CURLINFO_RTSP_SERVER_CSEQ — Next RTSP server CSeq
- CURLINFO_RTSP_SESSION_ID — RTSP session ID
- CURLINFO_CONTENT_LENGTH_DOWNLOAD_T — The content-length of the download. This is the value read from the Content-Type: field. -1 if the size isn’t known
- CURLINFO_CONTENT_LENGTH_UPLOAD_T — The specified size of the upload. -1 if the size isn’t known
- CURLINFO_HTTP_VERSION — The version used in the last HTTP connection. The return value will be one of the defined CURL_HTTP_VERSION_* constants or 0 if the version can’t be determined
- CURLINFO_PROTOCOL — The protocol used in the last HTTP connection. The returned value will be exactly one of the CURLPROTO_* values
- CURLINFO_PROXY_SSL_VERIFYRESULT — The result of the certificate verification that was requested (using the CURLOPT_PROXY_SSL_VERIFYPEER option). Only used for HTTPS proxies
- CURLINFO_SCHEME — The URL scheme used for the most recent connection
- CURLINFO_SIZE_DOWNLOAD_T — Total number of bytes that were downloaded. The number is only for the latest transfer and will be reset again for each new transfer
- CURLINFO_SIZE_UPLOAD_T — Total number of bytes that were uploaded
- CURLINFO_SPEED_DOWNLOAD_T — The average download speed in bytes/second that curl measured for the complete download
- CURLINFO_SPEED_UPLOAD_T — The average upload speed in bytes/second that curl measured for the complete upload
- CURLINFO_APPCONNECT_TIME_T — Time, in microseconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed
- CURLINFO_CONNECT_TIME_T — Total time taken, in microseconds, from the start until the connection to the remote host (or proxy) was completed
- CURLINFO_FILETIME_T — Remote time of the retrieved document (as Unix timestamp), an alternative to CURLINFO_FILETIME to allow systems with 32 bit long variables to extract dates outside of the 32bit timestamp range
- CURLINFO_NAMELOOKUP_TIME_T — Time in microseconds from the start until the name resolving was completed
- CURLINFO_PRETRANSFER_TIME_T — Time taken from the start until the file transfer is just about to begin, in microseconds
- CURLINFO_REDIRECT_TIME_T — Total time, in microseconds, it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started
- CURLINFO_STARTTRANSFER_TIME_T — Time, in microseconds, it took from the start until the first byte is received
- CURLINFO_TOTAL_TIME_T — Total time in microseconds for the previous transfer, including name resolving, TCP connect etc.
Return Values
If option is given, returns its value. Otherwise, returns an associative array with the following elements (which correspond to option ), or false on failure:
- «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»
- «primary_ip»
- «primary_port»
- «local_ip»
- «local_port»
- «redirect_url»
- «request_header» (This is only set if the CURLINFO_HEADER_OUT is set by a previous call to curl_setopt() )
Note that private data is not included in the associative array and must be retrieved individually with the CURLINFO_PRIVATE option.
Changelog
| Version | Description |
|---|---|
| 8.0.0 | handle expects a CurlHandle instance now; previously, a resource was expected. |
| 8.0.0 | option is nullable now; previously, the default was 0 . |
| 7.3.0 | Introduced CURLINFO_CONTENT_LENGTH_DOWNLOAD_T , CURLINFO_CONTENT_LENGTH_UPLOAD_T , CURLINFO_HTTP_VERSION , CURLINFO_PROTOCOL , CURLINFO_PROXY_SSL_VERIFYRESULT , CURLINFO_SCHEME , CURLINFO_SIZE_DOWNLOAD_T , CURLINFO_SIZE_UPLOAD_T , CURLINFO_SPEED_DOWNLOAD_T , CURLINFO_SPEED_UPLOAD_T , CURLINFO_APPCONNECT_TIME_T , CURLINFO_CONNECT_TIME_T , CURLINFO_FILETIME_T , CURLINFO_NAMELOOKUP_TIME_T , CURLINFO_PRETRANSFER_TIME_T , CURLINFO_REDIRECT_TIME_T , CURLINFO_STARTTRANSFER_TIME_T , CURLINFO_TOTAL_TIME_T . |
Examples
Example #1 curl_getinfo() example
// Create a cURL handle
$ch = curl_init ( ‘http://www.example.com/’ );
// Execute
curl_exec ( $ch );
// Check if any error occurred
if (! curl_errno ( $ch )) <
$info = curl_getinfo ( $ch );
echo ‘Took ‘ , $info [ ‘total_time’ ], ‘ seconds to send a request to ‘ , $info [ ‘url’ ], «n» ;
>
// Close handle
curl_close ( $ch );
?>
Example #2 curl_getinfo() example with option parameter
// Create a cURL handle
$ch = curl_init ( ‘http://www.example.com/’ );
// Execute
curl_exec ( $ch );
// Check HTTP status code
if (! curl_errno ( $ch )) <
switch ( $http_code = curl_getinfo ( $ch , CURLINFO_HTTP_CODE )) <
case 200 : # OK
break;
default:
echo ‘Unexpected HTTP code: ‘ , $http_code , «n» ;
>
>
// Close handle
curl_close ( $ch );
?>
Notes
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.
User Contributed Notes 12 notes
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:
= 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:
» ;
echo $info [ ‘http_code’ ] . » » . $http_codes [ $info [ ‘http_code’ ]];
>
Источник
Я использую функции PHP curl для отправки данных на веб-сервер с моей локальной машины. Мой код выглядит следующим образом:
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($c);
if (curl_exec($c) === false) {
echo «ok»;
} else {
echo «error»;
}
curl_close($c);
К сожалению, я не могу поймать ни одной ошибки типа 404, 500 или сетевого уровня. Как же мне узнать, что данные не были размещены или получены с удаленного сервера?
Ответ 1
Вы можете использовать функцию curl_error(), чтобы определить, произошла ли какая-то ошибка. Например:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $your_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Требуется для того, чтобы коды ошибок HTTP сообщались через наш вызов к curl_error($ch)
//…
curl_exec($ch);
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
}
curl_close($ch);
if (isset($error_msg)) {
// TODO — Обработать ошибку cURL соответствующим образом
}
Ответ 2
Если CURLOPT_FAILONERROR равно false, ошибки http не будут вызывать ошибок curl.
<?php
if (@$_GET[‘curl’]==»yes») {
header(‘HTTP/1.1 503 Service Temporarily Unavailable’);
} else {
$ch=curl_init($url = «http://».$_SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’].»?curl=yes»);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
$response=curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_errno= curl_errno($ch);
if ($http_status==503)
echo «HTTP Status == 503 <br/>»;
echo «Curl Errno returned $curl_errno <br/>»;
}
Ответ 3
Вы можете сгенерировать ошибку curl после его выполнения:
$url = ‘http://example.com’;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
echo ‘Request Error:’ . curl_error($ch);
}
И вот коды ошибок curl:
если кому-то нужна дополнительная информация об ошибках curl
<?php
$error_codes=array(
[1] => ‘CURLE_UNSUPPORTED_PROTOCOL’,
[2] => ‘CURLE_FAILED_INIT’,
[3] => ‘CURLE_URL_MALFORMAT’,
[4] => ‘CURLE_URL_MALFORMAT_USER’,
[5] => ‘CURLE_COULDNT_RESOLVE_PROXY’,
[6] => ‘CURLE_COULDNT_RESOLVE_HOST’,
[7] => ‘CURLE_COULDNT_CONNECT’,
[8] => ‘CURLE_FTP_WEIRD_SERVER_REPLY’,
[9] => ‘CURLE_REMOTE_ACCESS_DENIED’,
[11] => ‘CURLE_FTP_WEIRD_PASS_REPLY’,
[13] => ‘CURLE_FTP_WEIRD_PASV_REPLY’,
[14]=>’CURLE_FTP_WEIRD_227_FORMAT’,
[15] => ‘CURLE_FTP_CANT_GET_HOST’,
[17] => ‘CURLE_FTP_COULDNT_SET_TYPE’,
[18] => ‘CURLE_PARTIAL_FILE’,
[19] => ‘CURLE_FTP_COULDNT_RETR_FILE’,
[21] => ‘CURLE_QUOTE_ERROR’,
[22] => ‘CURLE_HTTP_RETURNED_ERROR’,
[23] => ‘CURLE_WRITE_ERROR’,
[25] => ‘CURLE_UPLOAD_FAILED’,
[26] => ‘CURLE_READ_ERROR’,
[27] => ‘CURLE_OUT_OF_MEMORY’,
[28] => ‘CURLE_OPERATION_TIMEDOUT’,
[30] => ‘CURLE_FTP_PORT_FAILED’,
[31] => ‘CURLE_FTP_COULDNT_USE_REST’,
[33] => ‘CURLE_RANGE_ERROR’,
[34] => ‘CURLE_HTTP_POST_ERROR’,
[35] => ‘CURLE_SSL_CONNECT_ERROR’,
[36] => ‘CURLE_BAD_DOWNLOAD_RESUME’,
[37] => ‘CURLE_FILE_COULDNT_READ_FILE’,
[38] => ‘CURLE_LDAP_CANNOT_BIND’,
[39] => ‘CURLE_LDAP_SEARCH_FAILED’,
[41] => ‘CURLE_FUNCTION_NOT_FOUND’,
[42] => ‘CURLE_ABORTED_BY_CALLBACK’,
[43] => ‘CURLE_BAD_FUNCTION_ARGUMENT’,
[45] => ‘CURLE_INTERFACE_FAILED’,
[47] => ‘CURLE_TOO_MANY_REDIRECTS’,
[48] => ‘CURLE_UNKNOWN_TELNET_OPTION’,
[49] => ‘CURLE_TELNET_OPTION_SYNTAX’,
[51] => ‘CURLE_PEER_FAILED_VERIFICATION’,
[52] => ‘CURLE_GOT_NOTHING’,
[53] => ‘CURLE_SSL_ENGINE_NOTFOUND’,
[54] => ‘CURLE_SSL_ENGINE_SETFAILED’,
[55] => ‘CURLE_SEND_ERROR’,
[56] => ‘CURLE_RECV_ERROR’,
[58] => ‘CURLE_SSL_CERTPROBLEM’,
[59] => ‘CURLE_SSL_CIPHER’,
[60] => ‘CURLE_SSL_CACERT’,
[61] => ‘CURLE_BAD_CONTENT_ENCODING’,
[62] => ‘CURLE_LDAP_INVALID_URL’,
[63] => ‘CURLE_FILESIZE_EXCEEDED’,
[64] => ‘CURLE_USE_SSL_FAILED’,
[65] => ‘CURLE_SEND_FAIL_REWIND’,
[66] => ‘CURLE_SSL_ENGINE_INITFAILED’,
[67] => ‘CURLE_LOGIN_DENIED’,
[68] => ‘CURLE_TFTP_NOTFOUND’,
[69] => ‘CURLE_TFTP_PERM’,
[70] => ‘CURLE_REMOTE_DISK_FULL’,
[71] => ‘CURLE_TFTP_ILLEGAL’,
[72] => ‘CURLE_TFTP_UNKNOWNID’,
[73] => ‘CURLE_REMOTE_FILE_EXISTS’,
[74] => ‘CURLE_TFTP_NOSUCHUSER’,
[75] => ‘CURLE_CONV_FAILED’,
[76] => ‘CURLE_CONV_REQD’,
[77] => ‘CURLE_SSL_CACERT_BADFILE’,
[78] => ‘CURLE_REMOTE_FILE_NOT_FOUND’,
[79] => ‘CURLE_SSH’,
[80] => ‘CURLE_SSL_SHUTDOWN_FAILED’,
[81] => ‘CURLE_AGAIN’,
[82] => ‘CURLE_SSL_CRL_BADFILE’,
[83] => ‘CURLE_SSL_ISSUER_ERROR’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[84] => ‘CURLE_FTP_PRET_FAILED’,
[85] => ‘CURLE_RTSP_CSEQ_ERROR’,
[86] => ‘CURLE_RTSP_SESSION_ERROR’,
[87] => ‘CURLE_FTP_BAD_FILE_LIST’,
[88] => ‘CURLE_CHUNK_FAILED’);
?>
Ответ 4
Поскольку вы заинтересованы в отлове ошибок, связанных с сетью, и ошибок HTTP, ниже приведен лучший подход:
function curl_error_test($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$responseBody = curl_exec($ch);
/*
* if curl_exec failed then
* $responseBody равно false
* curl_errno() возвращает ненулевое число
* curl_error() возвращает непустую строку
* Какой из них использовать — решать вам
*/
if ($responseBody === false) {
return «CURL Error: » . curl_error($ch);
}
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
/*
* 4xx коды состояния — ошибки клиента
* 5xx коды состояния — ошибки сервера
*/
if ($responseCode >= 400) {
return «HTTP Error: » . $responseCode;
}
return «Нет ошибки CURL или HTTP «;
}
Тесты:
curl_error_test(«http://expamle.com»); // Ошибка CURL : Невозможно определить хост : expamle.com
curl_error_test(«http://example.com/whatever»); // Ошибка HTTP: 404
curl_error_test(«http://example.com»); // Все в порядке с CURL или HTTP
Ответ 5
Еще один вариант кода:
$responseInfo = curl_getinfo($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$body = substr($response, $header_size);
$result=array();
$result[‘httpCode’]=$httpCode;
$result[‘body’]=json_decode($body);
$result[‘responseInfo’]=$responseInfo;
print_r($httpCode);
print_r($result[‘body’]); exit;
curl_close($ch);
if($httpCode == 403) {
print_r(«Доступ запрещен»);
exit;
} else {
// другие ошибки
}
PHP’s cURL functions are extremely useful for sending HTTP requests.
Some examples of its usefulness.
- Retrieving data from an external API.
- Sending data to an external web service.
- Checking to see if a HTTP resource exists.
- Crawling / scraping web pages (logging into other websites with PHP).
Although you can easily request external content via the function file_get_contents, cURL is much more useful in the sense that it allows us to detect and handle certain HTTP errors.
Let’s take the following example.
$url = 'http://example.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); echo $result;
As you can see, we have setup a very simple GET request that returns the contents of a website called example.com.
Unfortunately, this code doesn’t take into account the fact that the cURL request could fail. As a result, the request might fail without providing us with any details about what happened.
Using curl_errno to detect cURL errors.
This is where the curl_errno function comes in handy.
The curl_errno function will return the number 0 (zero) if the request was successful. In other words, it will return a “falsey” value if no error occurs. This is because PHP sees 0 as a false value in a boolean context.
This allows us to figure out whether or not our cURL request resulted in an error.
Take a look at the following example.
$url = 'http://example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
echo 'Request Error:' . curl_error($ch);
}
If an error occurs, then our script will print out the result of the curl_error function.
Throwing Exceptions.
In certain situations, you might want to throw an exception if a cURL request fails.
For this example, let us pretend that we have an object function called get.
/**
* Send a GET request to a URL.
*
* @param string $url
* @return string
* @throws Exception If cURL request fails.
*/
public function get($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)){
throw new Exception(curl_error($ch));
}
return $result;
}
As you can see, the function above will attempt to send a GET request to a given URL.
If all goes well, the function will return the contents of the URL.
However, if the request fails and a cURL error exists, PHP will throw an Exception.
This allows us to handle the request like so.
try{
$object->get('http://test.com');
} catch(Exception $e){
//do something with the exception you caught
}
In the above piece of code, we are using a TRY-CATCH block.
If we do not want our application to continue after a failed HTTP request, we can omit the TRY-CATCH block and let our Exception Handler deal with it.
cURL – это специальный инструмент, который предназначен для того, чтобы передавать файлы и данные синтаксисом URL. Данная технология поддерживает множество протоколов, таких как HTTP, FTP, TELNET и многие другие. Изначально cURL было разработано для того, чтобы быть инструментом командной строки. К счастью для нас, библиотека cURL поддерживается языком программирования PHP. В этой статье мы рассмотрим некоторые расширенные функций cURL, а также затронем практическое применение полученных знаний средствами PHP.
Почему cURL?
На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые PHP функции вместо cURL:
$content = file_get_contents("http://www.nettuts.com");
// или
$lines = file("http://www.nettuts.com");
// или
readfile("http://www.nettuts.com");
Однако данные функции не имеют фактически никакой гибкости и содержат огромное количество недостатков в том, что касается обработки ошибок и т.д. Кроме того, существуют определенные задачи, которые вы просто не можете решить благодаря этим стандартным функциям: взаимодействие с cookie, аутентификация, отправка формы, загрузка файлов и т.д.
cURL — это мощная библиотека, которая поддерживает множество различных протоколов, опций и обеспечивает подробную информацию о URL запросах.
Базовая структура
Прежде чем мы двинемся дальше к более сложным примерам, давайте рассмотрим базовую структуру cURL запроса в PHP. Существует четыре основных шага, которые нужно учитывать в каждом скрипте:
- Инициализация
- Назначение параметров
- Выполнение и выборка результата
- Освобождение памяти
// 1. инициализация $ch = curl_init(); // 2. указываем параметры, включая url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. получаем HTML в качестве результата $output = curl_exec($ch); // 4. закрываем соединение curl_close($ch);
Шаг #2 (то есть, вызов curl_setopt()) будем обсуждать в этой статье намного больше, чем все другие этапы, т.к. на этой стадии происходит всё самое интересное и полезное, что вам необходимо знать. В cURL существует огромное количество различных опций, которые должны быть указаны, для того чтобы иметь возможность сконфигурировать URL-запрос самым тщательным образом. Мы не будем рассматривать весь список целиком, а остановимся только на том, что я посчитаю нужным и полезным для этого урока. Всё остальное вы сможете изучить сами, если эта тема вас заинтересует.
Проверка Ошибки
Вдобавок, вы также можете использовать условные операторы для проверки выполнения операции на успех:
// ...
$output = curl_exec($ch);
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch);
}
// ...
Тут прошу отметить для себя очень важный момент: мы должны использовать “=== false” для сравнения, вместо “== false”. Для тех, кто не в курсе, это поможет нам отличать пустой результат от булевого значения false, которое и будет указывать на ошибку.
Получение информации
Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.
// ... curl_exec($ch); $info = curl_getinfo($ch); echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url']; // …
Возвращаемый массив содержит следующую информацию:
- “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”
Обнаружение перенаправления в зависимости от браузера
В этом первом примере мы напишем код, который сможет обнаружить перенаправления URL, основанные на различных настройках браузера. Например, некоторые веб-сайты перенаправляют браузеры сотового телефона, или любого другого устройства.
Мы собираемся использовать опцию CURLOPT_HTTPHEADER для того, чтобы определить наши исходящие HTTP заголовки, включая название браузера пользователя и доступные языки. В конечном итоге мы сможем определить, какие сайты перенаправляют нас к разным URL.
// тестируем URL
$urls = array(
"http://www.cnn.com",
"http://www.mozilla.com",
"http://www.facebook.com"
);
// тестируем браузеры
$browsers = array(
"standard" => array (
"user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
"language" => "en-us,en;q=0.5"
),
"iphone" => array (
"user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3",
"language" => "en"
),
"french" => array (
"user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",
"language" => "fr,fr-FR;q=0.5"
)
);
foreach ($urls as $url) {
echo "URL: $urln";
foreach ($browsers as $test_name => $browser) {
$ch = curl_init();
// указываем url
curl_setopt($ch, CURLOPT_URL, $url);
// указываем заголовки для браузера
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"User-Agent: {$browser['user_agent']}",
"Accept-Language: {$browser['language']}"
));
// нам не нужно содержание страницы
curl_setopt($ch, CURLOPT_NOBODY, 1);
// нам необходимо получить HTTP заголовки
curl_setopt($ch, CURLOPT_HEADER, 1);
// возвращаем результаты вместо вывода
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
// был ли HTTP редирект?
if (preg_match("!Location: (.*)!", $output, $matches)) {
echo "$test_name: redirects to $matches[1]n";
} else {
echo "$test_name: no redirectionn";
}
}
echo "nn";
}
Сначала мы указываем список URL сайтов, которые будем проверять. Точнее, нам понадобятся адреса данных сайтов. Далее нам необходимо определить настройки браузера, чтобы протестировать каждый из этих URL. После этого мы воспользуемся циклом, в котором пробежимся по всем полученным результатам.
Приём, который мы используем в этом примере для того, чтобы задать настройки cURL, позволит нам получить не содержание страницы, а только HTTP-заголовки (сохраненные в $output). Далее, воспользовавшись простым regex, мы можем определить, присутствовала ли строка “Location:” в полученных заголовках.
Когда вы запустите данный код, то должны будете получить примерно следующий результат:

Создание POST запроса на определённый URL
При формировании GET запроса передаваемые данные могут быть переданы на URL через “строку запроса”. Например, когда Вы делаете поиск в Google, критерий поиска располагаются в адресной строке нового URL:
http://www.google.com/search?q=ruseller
Для того чтобы сымитировать данный запрос, вам не нужно пользоваться средствами cURL. Если лень вас одолевает окончательно, воспользуйтесь функцией “file_get_contents()”, для того чтобы получить результат.
Но дело в том, что некоторые HTML-формы отправляют POST запросы. Данные этих форм транспортируются через тело HTTP запроса, а не как в предыдущем случае. Например, если вы заполнили форму на форуме и нажали на кнопку поиска, то скорее всего будет совершён POST запрос:
http://codeigniter.com/forums/do_search/
Мы можем написать PHP скрипт, который может сымитировать этот вид URL запроса. Сначала давайте создадим простой файл для принятия и отображения POST данных. Назовём его post_output.php:
Затем мы создаем PHP скрипт, чтобы выполнить cURL запрос:
$url = "http://localhost/post_output.php";
$post_data = array (
"foo" => "bar",
"query" => "Nettuts",
"action" => "Submit"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// указываем, что у нас POST запрос
curl_setopt($ch, CURLOPT_POST, 1);
// добавляем переменные
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
При запуске данного скрипта вы должны получить подобный результат:

Таким образом, POST запрос был отправлен скрипту post_output.php, который в свою очередь, вывел суперглобальный массив $_POST, содержание которого мы получили при помощи cURL.
Загрузка файла
Загрузка файла будет выглядеть практически так же, как и обычный POST запрос, так как все формы загрузки файла работают только с ним.
Сначала давайте создадим файл для того, чтобы сформировать его и отправить файлу upload_output.php:
А вот и код скрипта, который выполняет указанный выше функционал:
$url = "http://localhost/upload_output.php";
$post_data = array (
"foo" => "bar",
// файл, который необходимо загрузить
"upload" => "@C:/wamp/www/test.zip"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:

Множественный cURL
Одной из самых сильных сторон cURL является возможность создания «множественных» cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.
В классическом варианте cURL запроса выполнение скрипта приостанавливается, и происходит ожидание завершения операции URL запроса, после чего работа скрипта может продолжиться. Если вы намереваетесь взаимодействовать с целым множеством URL, это приведёт к довольно-таки значительным затратам времени, поскольку в классическом варианте вы можете работать только с одним URL за один раз. Однако, мы можем исправить данную ситуацию, воспользовавшись специальными обработчиками.
Давайте рассмотрим пример кода, который я взял с php.net:
// создаём несколько cURL ресурсов
$ch1 = curl_init();
$ch2 = curl_init();
// указываем URL и другие параметры
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//создаём множественный cURL обработчик
$mh = curl_multi_init();
//добавляем несколько обработчиков
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$active = null;
//выполнение
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//закрытие
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.
В этом примере есть два основных цикла. Первый цикл do-while вызывает функцию curl_multi_exec(). Эта функция не блокируемая. Она выполняется с той скоростью, с которой может, и возвращает состояние запроса. Пока возвращенное значение является константой ‘CURLM_CALL_MULTI_PERFORM’, это означает, что работа ещё не завершена (например, в данный момент происходит отправка http заголовков в URL); Именно поэтому мы продолжаем проверять это возвращаемое значение, пока не получим другой результат.
В следующем цикле мы проверяем условие, пока переменная $active = ‘true’. Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно ‘true’, до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение ‘блокируется’, пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.
А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей.
Проверяем ссылки в WordPress
Представьте себе блог с огромным количеством постов и сообщений, в каждом из которых есть ссылки на внешние интернет ресурсы. Некоторые из этих ссылок по различным причинам могли бы уже быть «мертвыми». Возможно, страница была удалена или сайт вовсе не работает.
Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 404, после чего предоставит нам подробнейший отчёт.
Сразу же скажу, что это не пример создания плагина для WordPress. Это всего на всего хороший полигон для наших испытаний.
Давайте же наконец начнём. Сначала мы должны сделать выборку всех ссылок из базы данных:
// конфигурация
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'wordpress';
$excluded_domains = array(
'localhost', 'www.mydomain.com');
$max_connections = 10;
// инициализация переменных
$url_list = array();
$working_urls = array();
$dead_urls = array();
$not_found_urls = array();
$active = null;
// подключаемся к MySQL
if (!mysql_connect($db_host, $db_user, $db_pass)) {
die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db($db_name)) {
die('Could not select db: ' . mysql_error());
}
// выбираем все опубликованные посты, где есть ссылки
$q = "SELECT post_content FROM wp_posts
WHERE post_content LIKE '%href=%'
AND post_status = 'publish'
AND post_type = 'post'";
$r = mysql_query($q) or die(mysql_error());
while ($d = mysql_fetch_assoc($r)) {
// делаем выборку ссылок при помощи регулярных выражений
if (preg_match_all("!href="(.*?)"!", $d['post_content'], $matches)) {
foreach ($matches[1] as $url) {
$tmp = parse_url($url);
if (in_array($tmp['host'], $excluded_domains)) {
continue;
}
$url_list []= $url;
}
}
}
// убираем дубликаты
$url_list = array_values(array_unique($url_list));
if (!$url_list) {
die('No URL to check');
}
Сначала мы формируем конфигурационные данные для взаимодействия с базой данных, далее пишем список доменов, которые не будут участвовать в проверке ($excluded_domains). Также мы определяем число, характеризующее количество максимальных одновременных соединений, которые мы будем использовать в нашем скрипте ($max_connections). Затем мы присоединяемся к базе данных, выбираем посты, которые содержат ссылки, и накапливаем их в массив ($url_list).
Следующий код немного сложен, так что разберитесь в нём от начала до конца:
// 1. множественный обработчик
$mh = curl_multi_init();
// 2. добавляем множество URL
for ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
}
// 3. инициализация выполнения
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 4. основной цикл
while ($active && $mrc == CURLM_OK) {
// 5. если всё прошло успешно
if (curl_multi_select($mh) != -1) {
// 6. делаем дело
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 7. если есть инфа?
if ($mhinfo = curl_multi_info_read($mh)) {
// это значит, что запрос завершился
// 8. извлекаем инфу
$chinfo = curl_getinfo($mhinfo['handle']);
// 9. мёртвая ссылка?
if (!$chinfo['http_code']) {
$dead_urls []= $chinfo['url'];
// 10. 404?
} else if ($chinfo['http_code'] == 404) {
$not_found_urls []= $chinfo['url'];
// 11. рабочая
} else {
$working_urls []= $chinfo['url'];
}
// 12. чистим за собой
curl_multi_remove_handle($mh, $mhinfo['handle']); // в случае зацикливания, закомментируйте данный вызов
curl_close($mhinfo['handle']);
// 13. добавляем новый url и продолжаем работу
if (add_url_to_multi_handle($mh, $url_list)) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
}
}
// 14. завершение
curl_multi_close($mh);
echo "==Dead URLs==n";
echo implode("n",$dead_urls) . "nn";
echo "==404 URLs==n";
echo implode("n",$not_found_urls) . "nn";
echo "==Working URLs==n";
echo implode("n",$working_urls);
function add_url_to_multi_handle($mh, $url_list) {
static $index = 0;
// если у нас есть ещё url, которые нужно достать
if ($url_list[$index]) {
// новый curl обработчик
$ch = curl_init();
// указываем url
curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_multi_add_handle($mh, $ch);
// переходим на следующий url
$index++;
return true;
} else {
// добавление новых URL завершено
return false;
}
}
Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии.
- 1. Создаём множественный обработчик;
- 2. Функцию add_url_to_multi_handle() мы напишем чуть позже. Каждый раз, когда она будет вызываться, начнётся обработка нового url. Первоначально, мы добавляем 10 ($max_connections) URL;
- 3. Для того чтобы начать работу, мы должны запустить функцию curl_multi_exec(). До тех пор, пока она будет возвращать CURLM_CALL_MULTI_PERFORM, нам ещё есть, что делать. Это нам нужно, главным образом, для того, чтобы создать соединения;
- 4. Далее следует основной цикл, который будет выполняться до тех пор, пока у нас есть хоть одно активное соединение;
- 5. curl_multi_select() зависает в ожидании, пока поиск URL не завершится;
- 6. И снова мы должны заставить cURL выполнить некоторую работу, а именно, сделать выборку данных возвращаемого ответа;
- 7. Тут происходит проверка информации. В результате выполнения запроса будет возвращён массив;
- 8. В возвращенном массиве присутствует cURL обработчик. Его мы и будем использовать для того, чтобы выбрать информацию об отдельном cURL запросе;
- 9. Если ссылка была мертва, или время выполнения скрипта вышло, то нам не следует искать никакого http кода;
- 10. Если ссылка возвратила нам страницу 404, то http код будет содержать значение 404;
- 11. В противном случае, перед нами находится рабочая ссылка. (Вы можете добавить дополнительные проверки на код ошибки 500 и т.д…);
- 12. Далее мы удаляем cURL обработчик, потому что больше в нём не нуждаемся;
- 13. Теперь мы можем добавить другой url и запустить всё то, о чём говорили до этого;
- 14. На этом шаге скрипт завершает свою работу. Мы можем удалить всё, что нам не нужно и сформировать отчет;
- 15. В конце концов, напишем функцию, которая будет добавлять url в обработчик. Статическая переменная $index будет увеличиваться каждый раз, когда данная функция будет вызвана.
Я использовал данный скрипт на своем блоге (с некоторыми неработающими ссылками, которые добавил нарочно для того, чтобы протестировать его работу) и получил следующий результат:

В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее.
Пару слов о других полезных опциях cURL
HTTP Аутентификация
Если на URL адресе есть HTTP аутентификация, то вы без труда можете воспользоваться следующим скриптом:
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // то сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
FTP загрузка
В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:
// открываем файл
$file = fopen("/path/to/file", "r");
// в url должно быть следующее содержание
$url = "ftp://username:password@mydomain.com:21/path/to/new/file";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
// указывам ASCII мод
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch);
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем адрес curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // если необходимо предоставить имя пользователя и пароль curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output = curl_exec($ch); curl_close ($ch);
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
curl_exec($ch);
curl_close ($ch);
function progress_function($ch,$str) {
echo $str;
return strlen($str);
}
Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.
Заключение
Сегодня мы познакомились с тем, как можно применить библиотеку cURL в своих корыстных целях. Я надеюсь, что вам понравилась данная статья.
Спасибо! Удачного дня!