PHP의 CURL 라이브러리를 사용하여 네트워크 요청을 할 때 Curl_share_init () 함수는 공유 핸들을 초기화하는 데 사용되므로 여러 CURL 세션이 DNS 캐시, 쿠키 등과 같은 리소스를 공유 할 수 있습니다. 그러나 많은 개발자가 Curl_share_init ()를 사용할 때 실패 문제를 공유 할 수 있으며, 이는 종종 리소스 충돌, 오해 또는 기본 라이브러리 (LIBCURL) 문제와 관련이 있습니다.
이 기사에서는 두 개의 디버깅 도구 인 Curl_error () 및 Curl_errno () 를 통해 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);
그러나 잘못 구성되거나 잘못 사용되면 일부 공유 작업이 실패하여 요청 예외, 데이터 혼동 또는 충돌로 나타납니다.
실패의 일반적인 원인에는 다음이 포함됩니다.
다른 스레드에서 동일한 컬 핸들을 사용하십시오.
공유 핸들 또는 핸들을 반복적으로 반복하십시오.
세트 공유 유형 (쿠키, DNS 등)은 하단에서 지원되지 않습니다.
libcurl 버전은 호환되지 않습니다.
특정 오류를 찾으려면 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);
오류 코드 | 일반적인 이유 |
---|---|
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 의 경우 현재 공유 핸들이 다른 핸들에서 사용 중이며 동시에 구성 또는 해제 할 수 없음을 의미합니다. 코드 로직을 확인해야합니다.
1 ??? libcurl 버전이 지원하여 curl_version ()을 사용하여 현재 지원되는 기능을 확인할 수 있는지 확인하십시오.
2 ?? 문제의 범위를 분리하려면 먼저 단일 컬 핸들을 사용하여 테스트 한 다음 공유 핸들을 소개하여 공유로 인한 문제인지 확인하십시오.
3 ???? Curl_Error () 및 Curl_Errno ()를 사용하려면 Curl_Exec () 직후에 자세한 오류를 확인해야합니다.
4 ?? Curlopt_verbose 를 통해 자세한 로그를 활성화하십시오.
curl_setopt($ch, CURLOPT_VERBOSE, true);
5 ?? libcurl이 스레드-세제로 컴파일되지 않는 한 스레드 안전 확인 스레드 안전은 여러 스레드에서 핸들을 공유하지 않습니다.