현재 위치: > 최신 기사 목록> PHP CURL_MULTI_CLOSE 성능 튜닝 팁

PHP CURL_MULTI_CLOSE 성능 튜닝 팁

gitbox 2025-05-29

동시 동시 시나리오에서 PHP 개발자는 종종 Curl_multi_* 시리즈 기능을 사용하여 동시 요청을 통해 인터페이스 응답 속도를 향상 시키거나 데이터 크롤링 효율성을 향상시킵니다. 그 중에서 Curl_multi_Close ()Curl_multi 핸들을 닫는 데 사용되는 중요한 기능이지만 부적절하게 사용하면 전반적인 성능 속도가 느려질 수 있습니다. 이 기사는 CURL_MULTI_CLOSE 의 사용을 최적화하여 PHP 프로그램의 실행 효율을 더욱 향상시키는 방법을 심층적으로 탐구합니다.

curl_multi_close의 기본 역할을 이해하십시오

curl_multi_init ()을 사용하여 다중 핸들 리소스를 작성한 후 일반적으로 Curl_multi_add_handle ()을 사용하여 여러 개의 별도의 리소스를 추가 한 다음 Curl_multi_exec () 를 통해 동시 요청을 실행합니다. 모든 요청이 완료된 후 Curl_multi_Close ()는 다중 핸들 리소스 및 무료 메모리를 닫는 데 사용됩니다.

표면적으로 Curl_multi_Close () 는 여파 단계 일 뿐이며 성능과 아무 관련이없는 것 같습니다. 그러나 실제로 많은 동시 요청 후에 잘못된 종료 방법이나 타이밍은 메모리 누출, 자원 차단 및 프로그램 실행 시간을 증가시킬 수 있습니다.

일반적인 성능 문제와 잘못된 사용

  1. 너무 일찍 마감 : Curl_Multi_Close () 호출 모든 요청이 실제로 완료되기 전에 일부 요청이 정상적으로 완료되지 않아 검색 수를 늘리고 리소스를 낭비하게됩니다.

  2. 클래스 핸들이 올바르게 정리되지 않습니다. 클래스 핸들Curl_multi_Remove_handle ()을 사용하여 클래스 핸들을 올바르게 제거하지 않으면 닫기 전에 시스템이 암시 적으로 파괴 오버 헤드를 증가시킵니다.

  3. 배치 요청 수가 너무 큽니다. 동시에 수천 개의 조항 핸들을 관리합니다. curl_multi_close () 가 올바르게 호출 되더라도 폐쇄 작업이 매우 느려집니다.

최적화 전략

1. 수정 마감 순서

curl_multi_close ()를 호출하기 전에 다음 순서로 작동해야합니다.

 $multiHandle = curl_multi_init();
$chList = [];

for ($i = 0; $i < 100; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/endpoint_$i");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $chList[] = $ch;
}

// 모든 요청을 수행하십시오
do {
    $status = curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

// 각 개별 핸들을 제거하고 닫습니다
foreach ($chList as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

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

핵심 사항 요약 :

  • curl_multi_remove_handle () 조항 핸들을 정리합니다

  • curl_close ()는 각 클론 핸들을 개별적으로 닫습니다

  • 마지막으로 curl_multi_close ()는 멀티 핸들 리소스를 닫습니다

이 처리는 메모리 누출을 크게 줄이고 방출 지연을 크게 줄일 수 있습니다.

2. 동시성 수를 제어하십시오

한 번에 너무 많은 요청을 보내지 마십시오. 최대 동시성 양을 설정하고 배치로 처리 할 수 ​​있습니다. 예를 들어, 한 번에 20 개의 요청 만 처리됩니다.

 $multiHandle = curl_multi_init();
$chList = [];
$maxConcurrent = 20;

$urls = [];
for ($i = 0; $i < 1000; $i++) {
    $urls[] = "https://gitbox.net/api/endpoint_$i";
}

$index = 0;
do {
    // 최대 동시성 요청 추가
    $chList = [];
    for ($i = 0; $i < $maxConcurrent && $index < count($urls); $i++, $index++) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $urls[$index]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($multiHandle, $ch);
        $chList[] = $ch;
    }

    do {
        $status = curl_multi_exec($multiHandle, $running);
        curl_multi_select($multiHandle);
    } while ($running > 0);

    // 제거하고 닫습니다
    foreach ($chList as $ch) {
        curl_multi_remove_handle($multiHandle, $ch);
        curl_close($ch);
    }

} while ($index < count($urls));

curl_multi_close($multiHandle);

효과:

  • 제어 시스템로드

  • 메모리 폭발을 피하십시오

  • curl_multi_close ()가 자원을 빠르게 해제 할 수 있는지 확인하십시오

3. 시간에 HTTP2 또는 지속적인 연결을 활성화합니다

서버 측 (예 : gitbox.net )이 HTTP/2를 지원하는 경우 동일한 연결에서 여러 요청을 다중화하여 리소스 오버 헤드를 크게 줄일 수 있습니다. Curlpipe_multiplex를 활성화 할 수 있습니다.

 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($multiHandle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);

이런 식으로 Curl_multi_Close ()는 기본 연결이 적기 때문에 닫을 때 더 빠릅니다.

요약

curl_multi_close () 는 전체 CURL 동시성 프로세스의 최종 단계 일뿐 만 아니라, 올바른 사용은 높은 동시성 및 고주파 요청 동안 PHP 프로그램의 안정성과 성능에 직접적인 영향을 미칩니다. 합리적으로 마감 조항 핸들, 동시성 제어 및 지속적인 연결을 활용함으로써 전체 시스템의 응답 속도 및 리소스 활용을 크게 향상시킬 수 있습니다.

고성능 PHP 응용 프로그램은 종종 이러한 상세한 최적화에 숨겨져 있습니다.