현재 위치: > 최신 기사 목록> 동시 요청이 완료된 후 모든 컬 세션을 우아하게 닫는 방법

동시 요청이 완료된 후 모든 컬 세션을 우아하게 닫는 방법

gitbox 2025-05-12

많은 동시 HTTP 요청을 만들 때 Curl_multi_* PHP가 제공하는 일련의 함수는 스크립트에서 동시에 여러 요청을 시작하여 실행 효율성을 향상시킬 수있는 매우 실용적인 도구입니다. 그 중에서 Curl_multi_Close () 는 전체 프로세스의 마지막 단계입니다. Curl_Multi_Init ()에 의해 초기화 된 리소스를 정리하여 모든 CURL 핸들이 제대로 닫히도록하여 자원 누출의 숨겨진 위험이 없습니다. 이 기사는 모든 동시 요청이 완료된 후 모든 컬 세션을 우아하게 닫는 방법을 자세히 설명하기 위해 완전한 예제를 사용합니다.

1. 기본 개념의 검토

동시 요청에 Curl_multi_*를 사용하는 경우 일반 프로세스는 다음과 같습니다.

  1. curl_multi 컨테이너를 초기화하십시오.

  2. 여러 요청을 생성하고 curl_multi 컨테이너에 추가하십시오.

  3. curl_multi_exec을 사용하여 모든 요청의 실행을 유도하십시오.

  4. 루프는 요청이 완료되었는지 확인합니다.

  5. 요청의 결과를 별도로 처리하십시오.

  6. 각 개별 핸들을 제거합니다.

  7. Curl_multi_Close ()를 사용하여 리소스를 해제하십시오.

2. 샘플 코드 설명

다음은 모든 요청이 완료된 후 여러 URL을 동시에 요청하고 자원을 우아하게 닫는 방법을 보여주는 예입니다.

 <?php

// 동시 요청을 보내려면 URL 목록
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3"
];

// 초기화 curl_multi 핸들
$multiHandle = curl_multi_init();
$curlHandles = [];

// 각각에 대해 URL 별도를 만듭니다 curl 핸들,그리고 가입 multi 핸들
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10
    ]);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// 모든 요청을 수행하십시오
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // curl_multi_select 활성 연결이있을 때까지 차단하십시오
    if ($active) {
        curl_multi_select($multiHandle);
    }
} while ($active && $mrc == CURLM_OK);

// 각 요청의 결과를 얻으십시오
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    $error = curl_error($ch);

    echo "URL: " . $info['url'] . PHP_EOL;
    echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
    echo "Response: " . $response . PHP_EOL;
    echo "Error: " . $error . PHP_EOL;
    echo str_repeat("-", 40) . PHP_EOL;

    // 移除并폐쇄핸들
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 마침내,폐쇄 multi 핸들
curl_multi_close($multiHandle);

?>

3. curl_multi_close에 대해 주목해야 할 사항

  • 모든 핸들이 제거 된 후에 만 ​​호출 : curl_multi_close ()를 호출하기 전에 먼저 curl_multi_remove_handle ()을 통해 멀티 컨테이너에서 모든 클론 핸들을 제거한 다음 curl_close ()를 하나씩 호출해야합니다. 그렇지 않으면 리소스가 공개되거나 행동 적 불확실하지 않을 수 있습니다.

  • 클론 핸들은 자동으로 닫히지 않습니다 . curl_multi_close ()는 멀티 컨테이너 자체 만 닫히고 내부 컬 핸들을 자동으로 닫지 않습니다. curl_init () 가 생성 한 각 핸들을 수동으로 닫아야합니다.

  • 통화 시간 : curl_multi_close ()는 전체 프로세스에서 실행하는 마지막 단계 여야합니다. 통화는 전체 동시 요청 수명주기의 공식 끝입니다.

4. 요약

curl_multi_init ()curl_multi_close ()를 올바르게 사용하면 PHP에서 동시 네트워크 요청을 효율적으로 수행하면서 사용 후 리소스를 올바르게 해제하여 메모리 누출 또는 연결 예외를 피할 수 있습니다. 기억하십시오 : 각 curl_init ()curl_close () 에 해당하고 각 curl_multi_init ()는 curl_multi_close () 에 해당하여 코드가 더 강력하고 신뢰할 수 있도록합니다.