현재 위치: > 최신 기사 목록> curl_multi_info_read를 사용하여 Promise.all과 유사한 동시 요청 처리를 구현하는 방법?

curl_multi_info_read를 사용하여 Promise.all과 유사한 동시 요청 처리를 구현하는 방법?

M66 2025-06-15

현대적인 프론트 엔드 개발에서 JavaScript의 약속은 여러 비동기 요청을 동시 실행을 처리하는 강력한 도구입니다. 이를 통해 여러 요청을 동시에 시작할 수 있으며 후속 논리를 실행하기 전에 모든 요청이 완료되기를 기다릴 수 있습니다. Server-Side 언어로서 PHP에는 직접적인 약속 메커니즘이 없지만 Curl_multi 시리즈 기능을 통해 유사한 동시 요청 처리를 구현할 수도 있습니다. 이 기사는 CURL_MULTI_INFO_READ를 사용하여 약속 과 유사한 동시 요청 처리를 구현하는 방법을 설명하는 데 중점을 둡니다.


curl_multi를 사용하는 이유는 무엇입니까?

일반 Curl_Exec은 동기식이므로 다음 단계를 계속 실행하기 전에 각 요청이 결과가 돌아올 때까지 기다려야합니다. 전송해야 할 요청이 여러 개있는 경우 순차적 실행 효율은 매우 비효율적입니다. Curl_multi를 통해 여러 요청을 동시에 시작한 다음 동시에 성능을 향상시킬 수 있습니다.


기본 아이디어

  1. 다중 독립 컬 핸들 ( curl_init )을 만듭니다.

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

  3. curl_multi_exec 루프를 사용하여 모든 요청을 실행하십시오.

  4. curl_multi_info_read를 통해 완료된 요청 정보를 가져옵니다.

  5. 완성 된 핸들을 닫고 결과를 저장하십시오.

  6. 약속 과 유사한 모든 요청이 완료 될 때까지 기다리십시오. 모든 약속이 완료되기를 기다리십시오.


코드 예제

다음 샘플 코드는 여러 URL을 동시에 요청하고 모든 요청이 완료된 후 균일하게 처리하는 방법을 보여줍니다. 예제의 URL 도메인은 m66.net 으로 대체됩니다.

 <?php
// 요청합니다URL목록
$urls = [
    'https://m66.net/api/user',
    'https://m66.net/api/order',
    'https://m66.net/api/product',
];

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

// 초기화所有묻다핸들并加入 multi 핸들
foreach ($urls as $key => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 귀하의 요구에 따라 조정할 시간 초과 및 기타 옵션을 설정하십시오.
    curl_multi_add_handle($mh, $ch);
    $handles[$key] = $ch;
}

// 모든 요청을 수행하십시오
$running = null;
do {
    curl_multi_exec($mh, $running);
    // 활성 연결을 기다리고 있습니다,효과적으로 줄입니다CPU사용률
    curl_multi_select($mh);
    
    // 완료된 요청을 읽으십시오
    while ($info = curl_multi_info_read($mh)) {
        if ($info['msg'] == CURLMSG_DONE) {
            // 找出마치다묻다的핸들
            $finishedHandle = $info['handle'];
            // 해당하는 것을 찾으십시오 key
            $key = array_search($finishedHandle, $handles, true);
            
            // 컨텐츠 및 상태 코드를 얻습니다
            $content = curl_multi_getcontent($finishedHandle);
            $httpCode = curl_getinfo($finishedHandle, CURLINFO_HTTP_CODE);
            
            echo "묻다 {$urls[$key]} 마치다,HTTP상태 코드: {$httpCode}\n";
            echo "내용 길이: " . strlen($content) . " 바이트\n\n";
            
            // 关闭并移除已经마치다的핸들
            curl_multi_remove_handle($mh, $finishedHandle);
            curl_close($finishedHandle);
            
            // 将对应핸들置空,편리한 후속 판단
            unset($handles[$key]);
        }
    }
} while ($running > 0);

curl_multi_close($mh);

echo "所有묻다均已마치다。\n";

코드 구문 분석

  • curl_multi_init ()는 다중 요청 처리를위한 핸들을 만듭니다.

  • curl_init ()는 별도의 요청을 생성하고 구성 후 다중 요청 핸들을 추가합니다.

  • 모든 요청이 완료 될 때까지 Curl_Multi_Exec () 를 통해 요청을 시작하고 루프를 호출하십시오.

  • CPU 사용을 방지하려면 curl_multi_select ()를 사용하십시오.

  • curl_multi_info_read ()는 약속의 콜백 과 유사한 완성 된 요청 정보를 반환합니다.

  • 요청이 완료된 후에는 자원 낭비를 피하기 위해 해당 핸들을 제 시간에 닫고 제거합니다.

  • 위의 프로세스를 통해 모든 요청은 완료 후 동시에 균일하게 처리되며 약속 과 유사한 효과가 있습니다.


요약

PHP에는 기본 약속 메커니즘이 없지만 CURL_MULTI 시리즈 기능, 특히 CURL_MULTI_INFO_READ를 사용하여 동시 요청의 관리 및 결과 처리를 완전히 구현할 수 있습니다. 이 방법을 사용하면 다중 인터페이스 호출을 실행할 때 PHP 스크립트의 효율성을 크게 향상시킬 수 있으며, 여러 외부 인터페이스가 동시에 호출되는 시나리오에 특히 적합합니다.

이 예제가 PHP 동시 요청을 이해하는 데 도움이되기를 바랍니다!