[CURL] 연결실패와 데이터를 가져오지 못한 차이 구분
간혹 데이터가 없는것이 연결이 잘못되어 그런것인지 서버쪽에서 주지 않아서 그런것인지 구분을 하고 싶을 때가 있다.
그런 경우 좀 자세하게 처리 하고싶을때 필요한 경우이다.
curl_exec 함수는 네트워크 문제나 URL 문제 등으로 데이터를 제대로 받아오지 못했을 때 false를 반환한다.
하지만 이것만으로는 연결 실패와 데이터 수신 실패를 구별하기 어렵기 때문에 정확한 것은 코드를 봐야 한다.
그런 경우에는 curl_errno 함수와 curl_error 함수를 사용하면 좀 더 구체적인 에러 정보를 얻을 수 있는데
curl_errno 함수는 에러 코드를 반환하고, curl_error 함수는 에러 메시지를 반환합니다.
curl 데이터 가져올때 연결실패와 가져오지 못한 차이 구분
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$output = curl_exec($ch);
if($output === false) {
$errno = curl_errno($ch);
echo 'errno: ' . $errno . PHP_EOL;
// CURLE_COULDNT_RESOLVE_HOST(6) : 잘못된 도메인
// CURLE_OPERATION_TIMEDOUT (28) : 연결 시간 초과
if(curl_errno($ch) == 28) {
echo "네트워크 연결 실패!!";
} else {
echo "데이터 수신 실패!! 에러 코드: " . curl_errno($ch) . ", 에러 메시지: " . curl_error($ch) . PHP_EOL;
}
}
else {
echo "성공!!";
file_put_contents('naver.html', $output);
}
curl_close($ch);
exit;
- CURLE_OK (0): 모든 것이 정상입니다. 에러가 없습니다.
- CURLE_UNSUPPORTED_PROTOCOL (1): 지원되지 않는 프로토콜입니다.
- CURLE_FAILED_INIT (2): 매우 초기화 상태에서 실패했습니다.
- CURLE_URL_MALFORMAT (3): URL 형식이 잘못되었습니다.
- CURLE_COULDNT_RESOLVE_PROXY (5): 프록시를 해석하지 못했습니다.
- CURLE_COULDNT_RESOLVE_HOST (6): 호스트를 해석하지 못했습니다.
- CURLE_COULDNT_CONNECT (7): 서버에 연결하지 못했습니다.
- CURLE_FTP_WEIRD_SERVER_REPLY (8): FTP 서버가 이상한 응답을 보냈습니다.
- CURLE_REMOTE_ACCESS_DENIED (9): 원격 서버에 접근이 거부되었습니다.
- CURLE_OPERATION_TIMEDOUT (28): 연산에 대한 시간 초과가 발생했습니다.
- CURLE_SSL_CONNECT_ERROR (35): SSL 연결이 실패하였습니다.
- CURLE_TOO_MANY_REDIRECTS (47): 지정된 시간 안에 너무 많은 리다이렉션이 발생하였습니다.
- CURLE_PEER_FAILED_VERIFICATION (60): 원격 서버의 인증서 확인이 실패하였습니다.
- CURLE_GOT_NOTHING (52): 서버로부터 아무런 데이터를 받지 못했습니다.