현재 위치: > 최신 기사 목록> 다중 스레드 환경에서 Curl_Close를 통해 리소스를 합리적으로 출시하는 방법은 무엇입니까?

다중 스레드 환경에서 Curl_Close를 통해 리소스를 합리적으로 출시하는 방법은 무엇입니까?

gitbox 2025-05-18

Curl은 HTTP 요청을 보내는 데 사용되는 도구로, 다른 웹 서비스와 쉽게 상호 작용할 수 있습니다. CURL을 통해 HTTP 요청을 실행하면 요청 된 구성, 실행 상태 및 기타 정보를 저장하기 위해 일부 메모리를 할당합니다. 이러한 리소스가 적시에 해제되지 않으면 메모리 누출로 이어질 수 있습니다.

멀티 스레드 환경 (예 : CURL_MULTI_* 함수 그룹을 통해 동시 요청을 수행)에서 여러 스레드가 여러 CURL 요청을 동시에 실행할 수 있습니다. 이러한 컬 리소스가 올바르게 닫히지 않으면 메모리 누출이 더 심해져 시스템의 성능과 안정성에 영향을 미칩니다.

2. curl_multi를 사용하여 동시 요청을 수행하십시오

PHP에서 Curl_multi_* 일련의 함수를 사용하면 여러 CURL 요청을 동시에 처리 할 수 ​​있으므로 프로그램의 효율성이 향상됩니다. 일반적으로 다음 코드는 동시에 여러 요청을 시작하는 데 사용됩니다.

 // 다중 생성cURL핸들
$multiCurl = curl_multi_init();
$curlHandles = [];

// 다중 초기화cURL세션
for ($i = 0; $i < 5; $i++) {
    $curlHandles[$i] = curl_init();
    curl_setopt($curlHandles[$i], CURLOPT_URL, "http://gitbox.net/api/data?id=$i");
    curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}

// 동시 요청을 수행하십시오
$running = null;
do {
    curl_multi_exec($multiCurl, $running);
} while ($running > 0);

// 폐쇄cURL세션
foreach ($curlHandles as $handle) {
    curl_multi_remove_handle($multiCurl, $handle);
    curl_close($handle);  // 正确폐쇄资源
}

// 폐쇄多路复用핸들
curl_multi_close($multiCurl);

위의 코드에서는 curl_multi_init ()를 사용하여 멀티플렉스 핸들을 만들고 curl_multi_add_handle ()을 통해 여러 컬 핸들을 멀티 플렉스에 추가하고 모든 요청을 실행합니다. 각 컬 핸들은 Curl_Close () 를 통해 닫히려면 메모리를 확보합니다.

3. 자원을 올바르게 해제하기 위해 Curl_Close ()를 사용해야하는 이유는 무엇입니까?

다중 스레드 환경에서 각 컬 요청에는 메모리 리소스 할당이 포함됩니다. 특히 많은 요청이있을 때 메모리 사용량이 커집니다. 컬 핸들을 닫는 것을 잊어 버리면 PHP 프로세스는 이러한 리소스를 제거 할 수 없으며 결국 메모리 누출로 이어질 것입니다.

위의 예에서, 각 컬 요청이 완료된 후에는 Curl_Close ($ hands) 를 통해 리소스를 명시 적으로 릴리스하여 메모리가 지속적으로 점유되지 않도록하고 잠재적 인 메모리 누출을 피합니다.

4. 오류 상황에서 리소스를 해제 할 수있는 방법

다중 스레드 환경에서는 네트워크 요청 실패, CURL 구성 오류 등과 같은 예기치 않은 오류가 발생할 수 있습니다.이 경우 적시에 리소스를 해제하는 것이 특히 중요합니다. 리소스가 릴리스되도록하려면 Try-Catch 문 또는 마지막 명령문을 사용하여 예외가 발생하는지 여부에 관계없이 리소스가 올바르게 릴리스되도록 할 수 있습니다.

 try {
    // 동시 요청을 시작하십시오
    $multiCurl = curl_multi_init();
    $curlHandles = [];
    for ($i = 0; $i < 5; $i++) {
        $curlHandles[$i] = curl_init();
        curl_setopt($curlHandles[$i], CURLOPT_URL, "http://gitbox.net/api/data?id=$i");
        curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, 1);
        curl_multi_add_handle($multiCurl, $curlHandles[$i]);
    }

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

    // 处理响应并폐쇄핸들
    // 여기서 반환 된 결과를 처리 할 수 ​​있습니다

} catch (Exception $e) {
    // 예외를 처리하십시오
    echo "Error occurred: " . $e->getMessage();
} finally {
    // 리소스가 해제되도록하십시오
    foreach ($curlHandles as $handle) {
        curl_multi_remove_handle($multiCurl, $handle);
        curl_close($handle);
    }
    curl_multi_close($multiCurl);
}

예외가 발생하는지 여부에 관계없이 컬 핸들이 닫혀 메모리 누출을 피하십시오.

5. 요약

다중 스레드 환경에서는 특히 여러 동시 요청을 처리 할 때 Curl_Close () 기능을 자유 리소스에 올바르게 사용하는 것이 중요합니다. 각 CURL 요청 후 CURL_CLOSE () 가 호출되고 예외가 발생할 때 리소스 릴리스를 보장 할 수있게함으로써 메모리 누출 문제를 효과적으로 피할 수 있으므로 프로그램의 안정성과 성능을 향상시킬 수 있습니다.

실제 개발에서는 특히 많은 동시 요청을 처리 할 때 항상 메모리 관리에주의를 기울여야합니다. 이 기사가 멀티 스레드 환경에서 CURL을 사용하여 자원 관리에 도움이되기를 바랍니다.