본문 바로가기
Coding/PHP

[PHP] CURL API 여러개의 URL 병렬 요청(curl_multi_init)

by jamong1014 2023. 11. 30.
반응형

일반적인 동기 실행 요청 코드

//일반적인 동기 실행 요청 코드
<?php

function makeCurlRequest($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    
    $urlarr = explode(">", $response); //본인이 정한 조건
    return substr($urlarr[22], 0, -9); //본인이 정한 조건
}

$url1 = "https://test1.com";
$url2 = "https://test2.com";
$url3 = "https://test3.com";


$urlres1 = makeCurlRequest($url1);
$urlres2 = makeCurlRequest($url2);
$urlres3 = makeCurlRequest($url3);

echo "$urlres1<br>";
echo "$urlres2<br>";
echo "$urlres3";
?>

 curl_multi_exec를 통해 병렬 요청

// curl_multi_exec를 통해 병렬 요청
<?php

function makeMultiCurlRequests($urls) {
    $multiCurlHandler = curl_multi_init();
    $curlHandlers = [];
    $responses = [];

    foreach ($urls as $url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        curl_multi_add_handle($multiCurlHandler, $ch);
        $curlHandlers[] = $ch;
    }

    $running = null;
    do {
        curl_multi_exec($multiCurlHandler, $running);
    } while ($running > 0);

    foreach ($curlHandlers as $index => $ch) {
        $response = curl_multi_getcontent($ch);

        // 여기서 각 응답을 처리하거나 저장
        $urlarr = explode(">", $response); //본인이 정한 조건
        $responses[$index] = substr($urlarr[22], 0, -9); //본인이 정한 조건

        curl_multi_remove_handle($multiCurlHandler, $ch);
    }

    curl_multi_close($multiCurlHandler);

    return $responses;
}

$urls = array(
    "https://test1.com",
    "https://test2.com",
    "https://test3.com"
);


$responses = makeMultiCurlRequests($urls);

// $responses 배열에는 각 URL에 대한 응답이 저장
$urlres1 = $responses[0];
$urlres2 = $responses[1];
$urlres3 = $responses[2];

echo "$urlres1<br>";
echo "$urlres2<br>";
echo "$urlres3";

?>

결론 : 후자가 curl 처리에 있어서 훨씬 빠름

반응형

댓글