현재 위치: > 최신 기사 목록> curl_multi_close 전에 요청이 완료되었는지 여부를 결정하는 방법

curl_multi_close 전에 요청이 완료되었는지 여부를 결정하는 방법

gitbox 2025-05-12

curl_multi_* 일련의 함수를 사용하여 동시 요청을 할 때는 일반적으로 여러 개의 핸들을 열고 통합 관리를 위해 Curl_multi 핸들에 추가합니다.
Resources를 해제하기 위해 Curl_Multi_Close를 호출하기 전에 모든 요청이 올바르게 완료되도록하려면 각 요청의 실행 상태를 합리적으로 감지해야합니다. 이 기사는이 요구 사항을 달성하는 표준적이고 신뢰할 수있는 방법을 설명합니다.

기본 프로세스 개요

일반적으로 여러 요청을 처리하기 위해 다음 단계를 수행합니다.

  1. 여러 별도 핸들을 초기화하십시오.

  2. 이 핸들을 curl_multi 핸들에 추가하십시오.

  3. curl_multi_exec을 사용하여 요청을 지속적으로 실행하십시오.

  4. curl_multi_select를 사용하여 curl_multi_exec 과 협력하여 요청이 완료되었는지 여부를 감지하십시오.

  5. 완료된 요청 처리를 하나씩 제거합니다.

  6. 모든 요청이 완료되었는지 확인한 다음 Curl_Multi_Close를 호출하십시오.

다음은 여러 URL을 요청해야한다고 가정 할 수 있습니다 (여기서 https://gitbox.net/example1https://gitbox.net/example2를 예제로 사용합니다).

 <?php

// 초기화 cURL multi 핸들
$multiHandle = curl_multi_init();

// 각각 저장하십시오 cURL 핸들的数组
$curlHandles = [];

// 요청합니다 URL 목록
$urls = [
    'https://gitbox.net/example1',
    'https://gitbox.net/example2',
];

// 각각을 만들고 추가하십시오 cURL 핸들
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// 구현하다 multi 묻다
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);

    // 예방하다 CPU 게으른
    if ($status == CURLM_OK) {
        curl_multi_select($multiHandle);
    } else {
        break;
    }

    // 检查是否有已完成的묻다
    while ($info = curl_multi_info_read($multiHandle)) {
        if ($info['msg'] == CURLMSG_DONE) {
            // 获取完成的핸들
            $completedHandle = $info['handle'];

            // 반환 된 콘텐츠를 얻으십시오
            $response = curl_multi_getcontent($completedHandle);

            // 반환 된 데이터는 여기에서 처리 할 수 ​​있습니다
            echo "묻다完成,반환 데이터 길이:" . strlen($response) . PHP_EOL;

            // 移除并关闭已完成的핸들
            curl_multi_remove_handle($multiHandle, $completedHandle);
            curl_close($completedHandle);
        }
    }
} while ($running > 0);

// 마지막으로 multi 핸들
curl_multi_close($multiHandle);

핵심 사항 설명

  • curl_multi_exec : 동시 요청의 실행을 촉진하고 여전히 실행중인 연결 수를 반환합니다.

  • curl_multi_select : CPU 자원 낭비를 줄이기 위해 활성 연결을 차단하고 기다리는 데 사용됩니다.

  • curl_multi_info_read : 요청이 완료되었는지 여부와 완성 된 핸들을 한 번에 처리 할 수 ​​있는지 감지합니다.

  • curl_multi_close$ running == 0 이고 모든 클론 핸들이 제거되고 닫힌 경우에만 호출됩니다.

  • 많은 요청이있는 경우 일부 요청이 오랫동안 고정되는 것을 방지하기 위해 타임 아웃 메커니즘을 추가하는 것이 좋습니다.

  • curl_multi_select가 때때로 -1을 반환합니다.이 경우 죽은 루프를 방지하기 위해 작은 대기에 usleep ()를 사용해야합니다.

반환 선택 의 간단한 처리 예 -1 :

 if (curl_multi_select($multiHandle) == -1) {
    usleep(100);
}

이를 통해 스크립트가 더 강력 해집니다.

요약

CURL_MULTI_CLOSE를 사용하기 전에 키는 모든 하위 수단이 완료되고 올바르게 정리되었음을 확인하는 것입니다. 위의 패턴은 일반적이고 권장되는 표준 연습입니다.
curl_multi_* 시리즈의 동작을 이해하면보다 효율적이고 안정적인 동시 네트워크 요청 코드를 작성하는 데 도움이됩니다!