현재 위치: > 최신 기사 목록> 루프에서 curl_multi_remove_handle을 자주 호출하기위한 성능 최적화 기술은 무엇입니까?

루프에서 curl_multi_remove_handle을 자주 호출하기위한 성능 최적화 기술은 무엇입니까?

gitbox 2025-06-08

1. curl_multi_remove_handle 의 작동 방식을 이해하십시오

php에서 curl_multi_* 일련의 함수는 일반적으로 curl_multi_add_handlecurl_multi_exec 과 함께 사용되는 동시 요청을 비동력있는 동시 요청을 제공합니다. curl_multi_add_handle을 사용하여 여러 컬 핸들을 멀티 핸들에 추가하면 Curl_Multi_Remove_Handle은 요청이 완료된 후 멀티 핸들에서 각 핸들을 제거 할 수 있습니다.

 $multiCurl = curl_multi_init();
$curlHandles = [];

// 다중 추가curl처리multi손잡이에
for ($i = 0; $i < 5; $i++) {
    $curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
    curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}

// 요청을 실행하십시오
do {
    $status = curl_multi_exec($multiCurl, $active);
} while ($active);

// 각 핸들을 제거하십시오
foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiCurl, $ch);
    curl_close($ch);
}

curl_multi_close($multiCurl);

위의 코드에서는 curl_multi_remove_handle을 통해 각 컬 핸들을 제거합니다. 리소스가 올바르게 릴리스되도록하지만 루프에서 Curl_Multi_Remove_handle 에 대한 빈번한 호출은 특히 요청 횟수가 높을 때 일부 성능 오버 헤드가 발생할 수 있습니다.


2. Curl_multi_Remove_handle 에 대한 빈번한 호출이 성능에 영향을 미치는 이유는 무엇입니까?

curl_multi_remove_handle을 호출 할 때 PHP는 바닥의 멀티 핸들 상태를 업데이트해야합니다. 이는 특히 동시 요청 수가 많을 때 비교적 시간이 많이 걸리는 작업입니다. 각 요청이 완료되면 핸들이 제거되고 PHP는 다중 스레드의 상태 정보를 처리하고 업데이트해야합니다. 핸들을 자주 제거하면 다음 성능 문제가 발생할 수 있습니다.

  • 빈번한 메모리 관리 : 핸들을 제거 할 때 기본 메모리 관리 메커니즘은 리소스를 재 할당해야하므로 메모리 할당 및 릴리스의 오버 헤드가 필요합니다.

  • 잠금 및 스레드 동기화 : curl_multi_remove_handle에는 병렬로 요청할 때 스레드 잠금 작업이 필요합니다. 빈번한 통화는 잠금 경쟁으로 이어질 수있어 실행 효율성을 더욱 줄일 수 있습니다.

  • 통화 스택의 복잡성 : 각 통화는 스택의 깊이, 특히 높은 동시성에서 콜 스택의 증가가 전반적인 성능에 영향을 줄 수 있습니다.

따라서 이러한 작업을 최적화하는 것은 성능 향상, 특히 자주 동시 요청이 필요한 경우 매우 중요합니다.


3. 성능 최적화 기술

3.1. 핸들의 배치 제거

각 요청이 완료된 직후에 curl_multi_remove_handle을 호출하는 대신 모든 요청이 완료된 후에 핸들을 균일하게 제거 할 수 있습니다. 이는 자주 리소스 업데이트를 피하고 성능 손실을 줄일 수 있습니다.

 $multiCurl = curl_multi_init();
$curlHandles = [];

// 다중 추가curl핸들
for ($i = 0; $i < 5; $i++) {
    $curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
    curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}

// 동시 요청을 수행하십시오
do {
    $status = curl_multi_exec($multiCurl, $active);
} while ($active);

// 统一移除所有핸들
foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiCurl, $ch);
    curl_close($ch);
}

curl_multi_close($multiCurl);

모든 요청이 완료된 후 핸들을 균일하게 제거하면 불필요한 중간 작업을 줄이고 성능을 향상시킬 수 있습니다.

3.2. curl_multi_remove_handle 로의 호출 수를 줄입니다

일부 시나리오에서는 동시 요청 수를 조정하여 CURL_MULTI_REMOVE_HANDLE 에 대한 호출 수를 줄일 수 있습니다. 예를 들어, 모든 요청의 배치 처리를 한 다음 배치 완료에 따라 핸들을 균일하게 제거하십시오.

 $multiCurl = curl_multi_init();
$curlHandles = [];

// 하나의 처리를 가정합니다10요청
$batchSize = 10;

for ($i = 0; $i < 100; $i++) {
    $curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
    curl_multi_add_handle($multiCurl, $curlHandles[$i]);
    
    if (count($curlHandles) == $batchSize) {
        // 동시 요청을 수행하십시오
        do {
            $status = curl_multi_exec($multiCurl, $active);
        } while ($active);

        // 统一移除当前批次的所有핸들
        foreach ($curlHandles as $ch) {
            curl_multi_remove_handle($multiCurl, $ch);
            curl_close($ch);
        }

        // 清空当前批次的핸들数组
        $curlHandles = [];
    }
}

// 여전히 요청이 남아있는 경우,계속 처리하십시오
if (count($curlHandles) > 0) {
    do {
        $status = curl_multi_exec($multiCurl, $active);
    } while ($active);

    // 统一移除剩余핸들
    foreach ($curlHandles as $ch) {
        curl_multi_remove_handle($multiCurl, $ch);
        curl_close($ch);
    }
}

curl_multi_close($multiCurl);

요청의 배치 처리를 통해 Curl_multi_Remove_handle 의 호출 수를 크게 줄여 성능이 향상 될 수 있습니다.

3.3. 지속적인 연결을 사용합니다

경우에 따라 동일한 API 호출을 자주 사용하면 HTTP 영구 연결을 활성화하는 것을 고려할 수 있습니다 (유지). 이로 인해 CURL은 매번 새로운 연결을 설정하지 않고 동일한 연결에서 여러 번 요청하여 CURL_MULTI_REMOVE_HANDLE 에 대한 많은 연결 오버 헤드와 빈번한 호출을 줄입니다.

curlopt_forbid_reuse를 true 로 설정하여 연결 재사용을 비활성화하여 각 요청에 새 연결을 사용하도록 할 수 있습니다. 연결 멀티플렉싱을 유지하면 일반적으로 특별한 요구없이 성능이 향상됩니다.

 curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Connection: keep-alive',
]);

연결을 지속함으로써 연결 생성 및 파괴의 빈도가 줄어들어 성능이 향상됩니다.

3.4. 컬 배치 인터페이스를 사용한 기본 최적화

요청 볼륨이 매우 크면 PHP 컬이 최선의 선택이 아닐 수도 있습니다. 이 경우 Guzzle 과 같은 최신 HTTP 클라이언트를 사용하는 것과 같은 고급 동시 요청 방법을 사용하는 것이 좋습니다. Guzzle은 일반적으로 동시 요청을 처리 할 때 더 나은 성능 및 메모리 관리가 더 좋습니다.