현재 위치: > 최신 기사 목록> curl_error () 및 curl_errno () 공유 실패 문제를 디버깅하는 기술

curl_error () 및 curl_errno () 공유 실패 문제를 디버깅하는 기술

M66 2025-05-31

PHP의 CURL 라이브러리를 사용하여 네트워크 요청을 할 때 Curl_share_init () 함수는 공유 핸들을 초기화하는 데 사용되므로 여러 CURL 세션이 DNS 캐시, 쿠키 등과 같은 리소스를 공유 할 수 있습니다. 그러나 많은 개발자가 Curl_share_init ()를 사용할 때 실패 문제를 공유 할 수 있으며, 이는 종종 리소스 충돌, 오해 또는 기본 라이브러리 (LIBCURL) 문제와 관련이 있습니다.

이 기사에서는 두 개의 디버깅 도구 인 Curl_error ()Curl_errno () 를 통해 Curl_share_init 로 인한 공유 실패 문제를 찾아서 해결하는 방법을 이해하게됩니다.

1 ??? curl_share_init () 란 무엇입니까?

curl_share_init () 는 공유 핸들을 만드는 데 사용되며, 일반적으로 curl_share_setopt () 와 함께 사용하여 공유 할 자원의 유형을 정의합니다. 마지막으로 핸들을 해제하려면 curl_share_close ()를 사용해야합니다.

Simple example:

 $sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

그러나 잘못 구성되거나 잘못 사용되면 일부 공유 작업이 실패하여 요청 예외, 데이터 혼동 또는 충돌로 나타납니다.

2 ?? 실패를 공유하는 일반적인 이유

실패의 일반적인 원인에는 다음이 포함됩니다.

  • 다른 스레드에서 동일한 컬 핸들을 사용하십시오.

  • 공유 핸들 또는 핸들을 반복적으로 반복하십시오.

  • 세트 공유 유형 (쿠키, DNS 등)은 하단에서 지원되지 않습니다.

  • libcurl 버전은 호환되지 않습니다.

특정 오류를 찾으려면 curl_error ()curl_errno ()를 사용해야합니다.

3 ???? curl_error () 및 curl_errno ()의 디버깅 기술

이 두 기능은 컬 오류 디버깅의 핵심입니다.

  • curl_error ($ ch) 마지막 컬 작업의 오류 메시지 (문자열 형식)를 반환합니다.

  • curl_errno ($ ch) 마지막 컬 작업의 오류 코드 (숫자 형태)를 반환합니다.

일반적으로 함께 사용됩니다.

 $ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

if ($result === false) {
    echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
    echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
    echo 'Request successful: ' . $result;
}

curl_close($ch);

공유 핸들 :

 $sh = curl_share_init();
if ($sh === false) {
    die("Failed to initialize curl share handle.\n");
}

$setopt_result = curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
if ($setopt_result === false) {
    echo "Failed to set share option.\n";
}

$ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

if ($result === false) {
    echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
    echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
    echo 'Request successful: ' . $result;
}

curl_close($ch);
curl_share_close($sh);

4 ?? 일반적인 오류 코드 및 문제 해결 아이디어

오류 코드 일반적인 이유
1 curle_unsupported_protocol
3 curle_url_malformat
5 curle_couldnt_resolve_proxy
6 curle_couldnt_resolve_host
7 curle_couldnt_connect
스물 셋 curle_write_error
43 curle_bad_function_argument
81 curle_share_in_use

Curle_share_in_use 의 경우 현재 공유 핸들이 다른 핸들에서 사용 중이며 동시에 구성 또는 해제 할 수 없음을 의미합니다. 코드 로직을 확인해야합니다.

5 ?? 실제 조사 단계

1 ??? libcurl 버전이 지원하여 curl_version ()을 사용하여 현재 지원되는 기능을 확인할 수 있는지 확인하십시오.

2 ?? 문제의 범위를 분리하려면 먼저 단일 컬 핸들을 사용하여 테스트 한 다음 공유 핸들을 소개하여 공유로 인한 문제인지 확인하십시오.

3 ???? Curl_Error ()Curl_Errno ()를 사용하려면 Curl_Exec () 직후에 자세한 오류를 확인해야합니다.

4 ?? Curlopt_verbose 를 통해 자세한 로그를 활성화하십시오.

 curl_setopt($ch, CURLOPT_VERBOSE, true);

5 ?? libcurl이 스레드-세제로 컴파일되지 않는 한 스레드 안전 확인 스레드 안전은 여러 스레드에서 핸들을 공유하지 않습니다.