현재 위치: > 최신 기사 목록> 동시 요청에서 curl_multi_close 기능의 일반적인 오류 분석

동시 요청에서 curl_multi_close 기능의 일반적인 오류 분석

gitbox 2025-05-12

PHP의 동시 요청에 대해 Curl_Multi_* 함수 라이브러리를 사용할 때 Curl_Multi_Close는 여러 CURL 세션 리소스를 닫는 매우 중요한 기능입니다. 그러나이를 사용할 때 개발자는 특히 많은 동시 요청을 처리 할 때 약간의 함정이 발생하기 쉽습니다. 이 기사는 Curl_multi_Close의 일반적인 오류를 깊이 분석하고 해당 솔루션을 제공합니다.

1. curl_multi_exec가 제대로 실행되지 않기 전에 curl_multi_close를 호출하십시오

CURL을 사용하여 여러 동시 요청을 사용하는 경우 모든 요청이 실행 된 후 Curl_Multi_Close를 호출해야합니다. curl_multi_exec을 호출 할 때 모든 요청이 올바르게 처리되지 않거나 세션이 완전히 실행되지 않고 닫히면 오류 또는 자원 누출이 발생할 수 있습니다.

일반적인 오류 :

 $mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 오류 데모:미리 전화하십시오 curl_multi_close
curl_multi_close($mh); // 요청이 아직 완료되지 않았습니다

해결책:
모든 요청이 완료된 후 Curl_Multi_Close 에 전화하십시오. 올바른 방법은 curl_multi_exec을 사용하여 요청이 완료 될 때까지 모니터링하고 기다리는 것입니다.

 $mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/data1');
$ch2 = curl_init('https://gitbox.net/api/data2');
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM || $active);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 올바르게 전화하십시오

2. 각 컬 핸들을 청소하는 것을 잊었습니다

요청이 완료된 후 각 컬 요청 핸들은 명시 적으로 제거해야합니다. 요청을 완료 한 후 핸들을 제거하는 것을 잊어 버린 경우 리소스 누출이 발생하고 프로그램의 성능 및 안정성에 영향을 줄 수 있습니다.

일반적인 오류 :

 curl_multi_add_handle($mh, $ch1);
// 손잡이를 제거하지 않고 직접 닫혔습니다 multi handle
curl_multi_close($mh); // 자원 누출을 일으킬 수 있습니다

해결책:
curl_multi_close를 호출하기 전에 각 컬 핸들을 제거하십시오.

 curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 리소스를 자유롭게합니다

3. CURL 요청이 성공했는지 확인하십시오

동시 요청을 실행할 때 일부 요청이 실패하여 Curl_multi_Close를 호출하기 전에 일부 핸들이 불완전한 상태로 유지됩니다. 이러한 유형의 문제를 방지하려면 각 요청의 실행 상태를 확인하십시오.

일반적인 오류 :

 $ch1 = curl_init('https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($ch1); // 요청이 실패한 경우,curl_exec 반품 false
if ($response1 === false) {
    echo 'Error: ' . curl_error($ch1);
}
curl_multi_close($mh); // 오류의 경우 일찍 닫습니다

해결책:
요청이 실패하면 사전에 연결을 닫지 않도록 청소하기 전에 각 요청이 성공적으로 실행되는지 확인하십시오.

 $response1 = curl_exec($ch1);
if ($response1 === false) {
    echo 'Error: ' . curl_error($ch1);
} else {
    curl_multi_remove_handle($mh, $ch1);
}
curl_multi_close($mh); // 모든 요청이 완료된 후에 만 ​​닫으십시오.

4. 잘못된 URL 형식 또는 요청 시간 초과

동시 요청에서 여러 요청이 동시에 발행됩니다. 요청 중 하나의 URL이 잘못되었거나 요청이 시간이 초과되면 Curl_Multi_Exec은 모든 요청을 정상적으로 완료하지 못할 수 있으며, 이는 CURL_MULTI_CLOSE 의 실행에 영향을 미칩니다.

일반적인 오류 :

 $ch = curl_init('https://gitbox.net/api/invalid_url'); // 잘못된 URL
curl_multi_add_handle($mh, $ch);
curl_multi_exec($mh, $active);
curl_multi_close($mh); // 요청이 아직 완료되지 않을 수 있습니다

해결책:
URL이 올바른지 확인하고 합리적인 시간 초과를 설정하십시오. 요청 시간 초과 시간은 curlopt_timeout을 통해 설정할 수 있습니다.

 curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch1, CURLOPT_TIMEOUT, 30); // 시간 초과를 설정하십시오 30 두번째

5. curl_multi_close를 여러 번 호출하십시오

curl_multi_close는 각 다중 핸들의 수명주기가 끝날 때 한 번만 호출해야합니다. 함수에 대한 여러 호출은 불필요한 오류 또는 리소스 릴리스 실패를 초래할 수 있습니다.

일반적인 오류 :

 curl_multi_close($mh); // 여러 통화
curl_multi_close($mh); // 두 번째 전화

해결책:
모든 요청이 완료되고 모든 핸들이 올바르게 제거 된 후 Curl_multi_Close가 한 번만 호출되고 실행되도록하십시오.

 curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); // 한 번만 호출됩니다

요약

curl_multi_close 는 동시 요청에서 중요한 기능이지만 주문 및 리소스 관리에주의를 기울여야합니다. Curl_Multi_Close를 호출하기 전에 모든 요청이 성공적으로 실행되고 핸들이 리소스 누출 또는 요청 예외를 피하기 위해 제거되었는지 확인하십시오. 동시에, 합리적인 오류 처리 및 시간 초과 제어를 통해 일반적인 오류를 피할 수 있습니다. 이러한 기술을 마스터하면 동시 요청이보다 안정적이고 효율적 일 수 있습니다.