현재 위치: > 최신 기사 목록> curl_multi_close 코드 최적화 : 불필요한 통화를 줄이는 방법

curl_multi_close 코드 최적화 : 불필요한 통화를 줄이는 방법

gitbox 2025-05-12

다중 요청 처리에 PHP의 확장을 사용할 때 Curl_multi_* 시리즈 기능은 매우 중요 합니다 . 그러나 많은 개발자들은 종종 무의식적으로 실제 프로젝트에서 Curl_multi_Close를 위 또는 잘못 호출하여 성능 저하 및 자원 낭비를 초래합니다. 그렇다면 왜 불필요한 curl_multi_close 통화를 줄여야합니까? 더 효율적으로 만드는 방법?

불필요한 curl_multi_close 호출을 줄이는 이유는 무엇입니까?

curl_multi_close 의 주요 기능은 curl_multi_init 에 의해 생성 된 다중 핸들 리소스를 닫는 것입니다. curl_multi_close가 호출 될 때마다 PHP 기본 레이어는 관련된 모든 내부 상태를 정리하는 것을 포함하여 리소스 릴리스 작업을 수행합니다. 이 오버 헤드는 소규모 요청에 무시할 수있는 것처럼 보일 수 있지만, 대규모 요청 환경에서 자주 및 의미없는 생성 및 다중 핸들 리소스의 생성 및 폐쇄는 다음과 같은 문제를 일으킬 수 있습니다.

  • 성능 오버 헤드 : 각 셧다운에는 기본 시스템 리소스의 릴리스 및 관리가 포함되어 CPU 및 메모리 부담이 증가합니다.

  • 자원 폐기물 : 반복적 인 생성 및 파괴는 프로그램이 차지하는 메모리 및 연결 자원의 상당한 변동으로 이어집니다.

  • 잠재적 안정성 문제 : 자주 자주 릴리스되면 추적하기 어려운 예외가 발생할 수 있습니다. 특히 요청 횟수가 클 경우 연결 오류, 요청 실패 및 기타 문제가 발생하기 쉬운 경우.

  • 동시성 성능 감소 : 스위칭 리소스가 자주 있기 때문에 처리 속도가 느려져 CURL_MULTI_* - 효율적인 동시 처리를 사용하려는 원래 의도를 위반합니다.

따라서 불필요한 CURL_MULTI_CLOSE 호출을 줄이면 응용 프로그램의 안정성과 전반적인 성능이 크게 향상 될 수 있습니다.

더 효율적으로 수행하는 방법은 무엇입니까?

curl_multi_close 의 사용을 최적화하기 위해, 핵심은 다중 핸들 리소스의 수명주기를 제어하고 창조와 파괴의 타이밍을 합리적으로 관리하는 것입니다. 실질적인 최적화 제안은 다음과 같습니다.

1. curl_multi_handle을 재사용하십시오

논리적으로 허용되면 동일한 멀티 핸들을 다중화하여 매번 재현하는 대신 여러 요청을 관리합니다. 초기화 단계에서 멀티 핸들을 생성하고 배치로 요청을 추가 한 후 배치 실행 후 균일하게 닫을 수 있습니다.

샘플 코드 :

 <?php

// 초기화 multi handle
$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/user/1',
    'https://gitbox.net/api/user/2',
    'https://gitbox.net/api/user/3',
];

$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

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

// 결과를 얻으십시오
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . PHP_EOL;

    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 끝에 만 닫으십시오 multi handle
curl_multi_close($multiHandle);

?>

2. 각 작은 배치 요청 직후에 닫히지 마십시오

많은 개발자들은 각 작은 요청이 완료된 후 습관적으로 curl_multi_close 습관적으로 습관화되므로 자주 스위칭 리소스가 발생합니다. 이를 수행하는 것이 좋습니다 . 모든 배치가 완료된 후 모든 배치를 균일하게 닫거나 합리적인 배치 크기 (예 : 100 요청 그룹)로 중앙에서 처리하는 것입니다.

3. 연결 풀 또는 관리 클래스를 통합하여 리소스를 캡슐화합니다.

응용 프로그램이 여러 요청을 시작 해야하는 경우 연결 풀 또는 전용 MultiCurlManager 클래스를 사용하여 멀티 핸들의 수명주기를 관리하는 것을 고려하십시오.

Simple example:

 <?php

class MultiCurlManager
{
    private $multiHandle;
    private $handles = [];

    public function __construct()
    {
        $this->multiHandle = curl_multi_init();
    }

    public function addRequest(string $url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($this->multiHandle, $ch);
        $this->handles[] = $ch;
    }

    public function execute()
    {
        do {
            $status = curl_multi_exec($this->multiHandle, $active);
            curl_multi_select($this->multiHandle);
        } while ($active);

        $responses = [];
        foreach ($this->handles as $ch) {
            $responses[] = curl_multi_getcontent($ch);
            curl_multi_remove_handle($this->multiHandle, $ch);
            curl_close($ch);
        }

        return $responses;
    }

    public function __destruct()
    {
        curl_multi_close($this->multiHandle);
    }
}

// 사용
$manager = new MultiCurlManager();
$manager->addRequest('https://gitbox.net/api/data1');
$manager->addRequest('https://gitbox.net/api/data2');
$manager->addRequest('https://gitbox.net/api/data3');

$responses = $manager->execute();
foreach ($responses as $response) {
    echo $response . PHP_EOL;
}

?>

이 방법은 수명주기를 자동으로 관리하고 누락되거나 누락 된 리소스를 방지 할 수 있습니다.

요약

curl_multi_close 는 필수 자원 청소 단계이지만 불합리하거나 빈번한 통화는 실제로 시스템 성능을 떨어 뜨립니다 . 멀티 핸들을 다중화하거나 배치 클로저 타이밍을 합리적으로 관리하거나 연결 풀 관리를 도입함으로써 멀티 반복 처리의 효율성과 안정성을 크게 향상시킬 수 있습니다.

실제 개발에서 이러한 세부 사항에주의를 기울이면 동시 HTTP 요청을 처리 할 때 PHP 응용 프로그램이 더 편안해집니다.