현재 위치: > 최신 기사 목록> Curl_Multi_Close에서 요청의 시간 초과 제어를 구현하는 방법

Curl_Multi_Close에서 요청의 시간 초과 제어를 구현하는 방법

gitbox 2025-05-12

PHP에서 Curl_multi_* 일련의 함수를 사용하면 여러 HTTP 요청을 동시에 보낼 수 있으므로 프로그램의 실행 효율을 크게 향상시킬 수 있습니다. 그러나 많은 사람들 이 curl_multi_close를 사용하여 다중 요청 세션을 종료하면 중요한 문제를 무시하는 경향이 있습니다.

시간 초과 시간이 합리적으로 제어되지 않으면 요청이 오랫동안 응답하지 않으면 전체 응용 프로그램이 고정되어 사용자 경험이 매우 나빠질 수 있습니다. 이 기사는 예제를 사용하여 curl_multi_close를 사용할 때 타임 아웃 제어를 우아하게 구현하는 방법을 가르쳐줍니다.

기본 아이디어

실제로 Curl_multi_Close는 Curl_multi 핸들을 닫는 데만 사용되며 시간 초과 자체를 제어하지 않습니다 . 실시간 제어 컨트롤은 요청을 실행하는 단계에서 발생해야합니다 (예 : Curl_Multi_ExecCURL_MULTI_SLECT ).

간단히 말해서 시간 초과 제어는 다음에 따라 다릅니다.

  • 단일 컬 핸들에서 시간 초과를 설정하십시오

  • 실행 루프에서 총 시간을 기록하고 판단하십시오.

샘플 코드

다음은 실용적인 예입니다. https://gitbox.net/api/endpoint1https://gitbox.net/api/endpoint2 를 요청하는 두 가지 요청이 있다고 가정하면 모든 요청이 총 10 초 이상 걸리지 않기를 바랍니다.

 <?php

// 두 개를 만듭니다 cURL 핸들
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

// 각 요청에 대한 타임 아웃을 별도로 설정하십시오(선택 과목)
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_TIMEOUT, 8); // 1 인당 가장 많은 요청8두번째
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_TIMEOUT, 8);

// a cURL 批处理핸들
$mh = curl_multi_init();

// 添加핸들到批处理핸들中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 배치 처리를 수행하십시오
$startTime = microtime(true);
$timeout = 10; // 총 타임 아웃(두번째)

do {
    $status = curl_multi_exec($mh, $active);

    // 여전히 활성 연결이있는 경우
    if ($active) {
        // 차단 및 대기
        $n = curl_multi_select($mh, 1.0);

        // 만약에 select 반품 -1,바쁜 대기를 피하십시오
        if ($n === -1) {
            usleep(100000); // 잠100毫두번째
        }
    }

    // 시간 초과를 확인하십시오
    if ((microtime(true) - $startTime) > $timeout) {
        echo "요청 할 총 시간이 초과됩니다{$timeout}두번째,강제 중단。\n";
        break;
    }
} while ($active && $status == CURLM_OK);

// 결과를 읽으십시오
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 关闭핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);

// 인쇄 결과
echo "Response 1: " . substr($response1, 0, 100) . "...\n";
echo "Response 2: " . substr($response2, 0, 100) . "...\n";
?>

핵심 요점 요약

  1. Curlopt_Timeout은 단일 요청 의 시간 초과를 제어합니다.

  2. 마이크로 타임 (True) 을 기록함으로써 총 실행 시간은 수동으로 제어됩니다.

  3. curl_multi_select를 사용하는 경우 과도한 CPU 사용을 피하기 위해 적절한 시간 초과 값 (예 : 1 초)을 설정하십시오.

  4. CURL_MULTI_CLOSE 는 리소스 청소를 담당하며 타임 아웃 로직을 제어하지 않습니다 .

주목해야 할 것

  • 너무 짧은 선택 시간 초과 (예 : 0.01 초)를 설정하면 시스템 부하가 증가 할 수 있습니다.

  • curl_multi_select가 -1을 반환하는 경우, 대기 할 파일 설명자가없고 바쁜 루프를 피하기 위해 적절한 수면 ( 수면 )이 필요하다는 것을 의미합니다.

  • 시간 초과가 발생하면 자원 누출을 피하기 위해 미완성 요청을 사전에 취소하는 것이 가장 좋습니다.