현재 위치: > 최신 기사 목록> Curl_multi_Close 요청 프로세스 중 인터럽트에 응답하는 방법

Curl_multi_Close 요청 프로세스 중 인터럽트에 응답하는 방법

gitbox 2025-05-29

PHP에서 curl_multi 함수를 사용하는 경우 일반적인 상황에 직면 할 수 있습니다. 다중 요청 병렬 처리 과정에서 Curl_multi_close ()는 현재 진행중인 요청을 방해 할 수 있습니다. 이 문제는 때때로 프로그램이 모든 동시 요청을 원활하게 완료하지 못 하므로이 문제를 피하기 위해 적절한 조치가 필요합니다. 이 기사는 요청 프로세스 중에 Curl_multi_Close 중단 문제를 효과적으로 다루는 방법을 소개합니다.

curl_multi_close 란 무엇입니까?

curl_multi_close () 는 php의 컬 확장에서 제공하는 함수입니다. curl curl _multi_init () 에 의해 생성 된 여러 핸들을 닫습니다. 그 기능은 리소스를 해제하는 것이지만 요청 프로세스 중에 함수가 미리 호출되면 미완성 요청을 방해 할 수 있습니다. 이로 인해 데이터 손실 또는 불완전한 요청이 발생하여 시스템의 안정성과 성능에 영향을 미칩니다.

코드 예제

간단한 curl_multi 요청 예는 다음과 같습니다.

 <?php
// 초기화 curl_multi 핸들
$mh = curl_multi_init();

// 다중 생성 cURL 핸들
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 각각을 넣으십시오 cURL 핸들添加到 multi 핸들中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 모든 요청을 수행하십시오
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// 반환 된 데이터를 얻으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 폐쇄 cURL 핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 폐쇄 multi 핸들
curl_multi_close($mh);
?>

이 예에서는 curl_multi_add_handle () 을 통해 다중 핸들 $ MH 에 여러 컬 핸들을 추가하고 curl_multi_exec () 를 통해 모든 요청을 병렬로 실행합니다. 마지막으로 Curl_multi_Remove_handle ()Curl_Multi_Close ()를 통해 다중 핸들을 닫습니다.

문제가 발생합니다

문제는 curl_multi_close () 가 호출 될 때 발생하여 여러 핸들을 미리 닫아 요청이 중간에 중단 될 수 있습니다. 모든 요청이 완료되지 않은 경우 인터럽트가 발생하면 미완성 요청은 응답 데이터를 얻거나 결과를 반환 할 수 없습니다.

중단 문제를 피하는 방법은 무엇입니까?

curl_multi_close ()가 요청을 방해하지 않도록하기 위해 다음 방법을 사용할 수 있습니다.

1. Curl_Multi_Close () 호출하기 전에 모든 요청이 완료되었는지 확인하십시오.

가장 일반적인 솔루션은 모든 요청이 완료되었는지 확인한 다음 Curl_Multi_Close () 를 호출하는 것입니다. curl_multi_exec () 의 반환 값을 사용하여 모든 요청이 완료되었는지 여부를 결정할 수 있습니다. 실행중인 변수의 값이 0이면 모든 요청이 완료되었음을 의미합니다. 그래야만 curl_multi_close () 호출됩니다.

수정 된 코드는 다음과 같습니다.

 <?php
// 초기화 curl_multi 핸들
$mh = curl_multi_init();

// 다중 생성 cURL 핸들
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 각각을 넣으십시오 cURL 핸들添加到 multi 핸들中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 모든 요청을 수행하십시오
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
    // 속도를 늦추기 위해 작은 지연을 추가 할 수 있습니다. CPU 사용률
    usleep(100);
} while ($running > 0);

// 반환 된 데이터를 얻으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 폐쇄 cURL 핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 폐쇄 multi 핸들
curl_multi_close($mh);
?>

요청은 실행이 0이 될 때까지 do-while 루프를 통해 지속적으로 실행되며,이 시점에서 모든 요청이 완료 되고 Curl_multi_Close ()가 안전하게 호출 될 수 있습니다.

2. 오류를 잡고 다시 시도하십시오

때로는 모든 요청이 완료된 것처럼 보이더라도 네트워크 실패와 같은 문제로 인해 중단 될 수 있습니다. 현재 요청이 실패하면 재 시도를 고려할 수 있습니다.

 <?php
// 레트리 시간의 최대 수를 설정하십시오
$maxRetries = 3;

function performRequest($ch, $maxRetries) {
    $retryCount = 0;
    $response = null;
    while ($retryCount < $maxRetries) {
        $response = curl_exec($ch);
        if ($response !== false) {
            break;
        }
        $retryCount++;
        usleep(500000); // 다시 시도하기 전에 잠시 기다리십시오
    }
    return $response;
}

// 초기화 curl_multi 핸들
$mh = curl_multi_init();

// 다중 생성 cURL 핸들
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 각각을 넣으십시오 cURL 핸들添加到 multi 핸들中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 모든 요청을 수행하십시오
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// 반환 된 데이터를 얻으십시오,다시 시도하십시오
$response1 = performRequest($ch1, $maxRetries);
$response2 = performRequest($ch2, $maxRetries);

// 폐쇄 cURL 핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 폐쇄 multi 핸들
curl_multi_close($mh);
?>

위의 코드에서, PerformRequest () 함수는 최대 재시도에 도달 할 때까지 요청이 실패 할 때 재 시도를 시도합니다. 이는 네트워크 문제로 인한 요청 중단을 효과적으로 피할 수 있습니다.

3. curl_multi_select () 사용

curl_multi_select ()는 각 루프에서 curl_multi_exec ()를 호출하는 것을 피하면서 PHP 프로그램이 여러 요청을보다 효율적으로 처리하는 데 도움이 될 수 있습니다. 특정 조건이 충족되면 요청을 계속 실행하여 시스템 리소스를 절약 할 수 있습니다.

 <?php
// 초기화 curl_multi 핸들
$mh = curl_multi_init();

// 다중 생성 cURL 핸들
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 각각을 넣으십시오 cURL 핸들添加到 multi 핸들中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 모든 요청을 수행하십시오
$running = null;
do {
    curl_multi_select($mh);
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// 반환 된 데이터를 얻으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 폐쇄 cURL 핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 폐쇄 multi 핸들
curl_multi_close($mh);
?>

curl_multi_select ()는 사용 가능한 데이터가 없을 때 대기 할 수 있으므로 불필요한 CPU 사용을 피할 수 있습니다. 특히 많은 요청이있을 때보다 효율적인 방법입니다.