Php curl код ошибки

curl_getinfo

// Проверяем наличие ошибок
if (! curl_errno ( $ch )) switch ( $http_code = curl_getinfo ( $ch , CURLINFO_HTTP_CODE )) case 200 : # OK
break;
default:
echo ‘Неожиданный код HTTP: ‘ , $http_code , «\n» ;
>
>

// Закрываем дескриптор
curl_close ( $ch );
?>

Примечания

Замечание:

Информация, собранная этой функцией, будет сохранена при дальнейшем использовании дескриптора. Это означает, что если статистика не будет перезаписана самой функцией, будет возвращаться информация по предыдущему запросу.

User Contributed Notes 13 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:
$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:
» ;
echo $info [ ‘http_code’ ] . » » . $http_codes [ $info [ ‘http_code’ ]];
>

Источник

Как отловить ошибки cURL в PHP

Я использую функции 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.

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
«;

echo «Curl Errno returned $curl_errno
«;

>

Ответ 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

$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

// другие ошибки

>

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

curl_error

Возвращает понятное сообщение об ошибке для последней операции cURL.

Список параметров

Дескриптор cURL, полученный из curl_init() .

Возвращаемые значения

Возвращает сообщение об ошибке или » (пустую строку), если ошибки не произошло.

Список изменений

Примеры

Пример #1 Пример использования curl_error()

// Создаём дескриптор 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 );
?>

Смотрите также

User Contributed Notes 4 notes

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.

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_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.

Оцените статью