현재 위치: > 최신 기사 목록> 높은 동시성 시나리오에서 Curl_Close 기능을 올바르게 사용하여 연결 풀 리소스 낭비를 피하는 방법은 무엇입니까?

높은 동시성 시나리오에서 Curl_Close 기능을 올바르게 사용하여 연결 풀 리소스 낭비를 피하는 방법은 무엇입니까?

gitbox 2025-05-26

PHP 네트워크 요청에서 CURL은 가장 일반적으로 사용되는 도구 중 하나입니다. 특히 동시 HTTP 요청을 처리 할 때 CURL 관련 기능의 합리적인 사용은 시스템의 안정성 및 자원 활용과 직접 관련이 있습니다. 이 기사는 CURL_CLOSE () 기능에 중점을 두어 고 동시성 시나리오에서 올바른 사용과 잘못된 사용으로 인해 발생할 수있는 자원 폐기물 문제를 논의합니다.

1. 컬에 대한 간단한 검토

CURL은 PHP가 제공하는 강력한 네트워크 요청 라이브러리이며 HTTP/HTTPS 요청을 시작하는 데 사용할 수 있습니다. 사용 프로세스는 대략 다음과 같습니다.

  1. 초기화 : curl_init ()

  2. 매개 변수 설정 : curl_setopt ()

  3. 요청 요청 : curl_exec ()

  4. 자원을 닫습니다 : curl_close ()

일반적으로 개발자는 각각의 요청 후 자원을 해제하기위한 Curl_Close () 에 전화합니다. 이 습관은 일생성이 낮거나 일생 단기 스크립트에서 큰 문제가되지 않지만 일회성이 높거나 긴 연결된 서비스에서 성능 트랩이 숨겨 질 수 있습니다.

2. 풀 리소스를 연결하는 원리

PHP가 CURL을 사용하고 CURL_SHARE 또는 CURLOPT_FORBID_REUSE 와 같은 매개 변수를 활성화하면 기본 Libcurl 라이브러리는 기존 연결 (즉, 연결 풀)을 재사용하려고합니다. 연결 멀티플렉싱은 TCP 연결 구축 및 TLS 핸드 셰이크와 같은 오버 헤드를 크게 줄이고 요청 효율성을 향상시킬 수 있습니다.

그러나 문제는 curl_close ()가 호출 될 때마다 현재 핸들에 해당하는 연결 정보가 파괴된다는 것입니다. 기본 연결이 재사용 값을 소진하지 않더라도 연결이 끊어져 연결 풀이 유효하지 않고 자원 낭비가됩니다.

3. 오류 예 : 각 요청 직후에 연결을 닫습니다.

 function fetchData($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch); // 매번 연결을 파괴하십시오
    return $response;
}

$data = fetchData("https://gitbox.net/api/data");

동시 동시성 에서이 패턴은 매번 새로운 연결을 설정하여 서버 측에 큰 압력을 가하고 로컬 리소스 소비를 증가시킵니다.

4. 최적화 전략 : 핸들을 재사용하거나 연결 풀을 공유합니다

방법 1 : 컬 핸들을 재사용하십시오

배치 요청에서 컬 핸들을 재사용하고 URL 만 업데이트하고 요청 매개 변수 만 업데이트 할 수 있습니다.

 $ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$urls = [
    "https://gitbox.net/api/user",
    "https://gitbox.net/api/data",
    "https://gitbox.net/api/config"
];

foreach ($urls as $url) {
    curl_setopt($ch, CURLOPT_URL, $url);
    $response = curl_exec($ch);
    // 거래하십시오 $response
}

curl_close($ch); // 마지막으로 통합 폐쇄

이 접근법은 연결 설정 및 폐쇄 빈도를 ​​크게 줄이고 동일한 수명주기에서 여러 유사한 요청에 적합합니다.

방법 2 : curl_multi 인터페이스를 사용하고 합리적으로 닫습니다

동시 요청의 경우 Curl_multi_init ()를 사용하여 여러 핸들을 관리 한 다음 실행 후 균일하게 닫는 것이 좋습니다.

 $multi = curl_multi_init();
$chs = [];
$urls = [
    "https://gitbox.net/api/user",
    "https://gitbox.net/api/data",
    "https://gitbox.net/api/config"
];

foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multi, $ch);
    $chs[$i] = $ch;
}

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

foreach ($chs as $ch) {
    $content = curl_multi_getcontent($ch);
    // 거래하십시오 $content
    curl_multi_remove_handle($multi, $ch);
    curl_close($ch);
}

curl_multi_close($multi);

이 방법은 연결 풀의 멀티플렉싱 기능을 완전히 활용할 수 있으며 동시 인터페이스 요청 시나리오에서 매우 실용적입니다.

V. 기타 예방 조치

  • HTTP Keep-Alive 프로토콜을 사용해야합니다.

  • 자주 요청되는 도메인 이름의 경우 DNS 캐시 또는 IP 직접 연결을 고려해야합니다.

  • 죽은 연결을 피하기 위해 Curlopt_Timeout을 합리적으로 사용하십시오.

  • PHP-FPM 환경에서 요청 당 모든 CURL 구성을 재구성하는 것을 피하고 일반적인 로직 캡슐화를 다중화합니다.

6. 결론

고 동시성 PHP 응용 프로그램에서 Curl_Close () 는 "근접"도구가 아닙니다. 근본적인 행동과 연결 재사용 메커니즘을 이해하면 개발자가보다 효율적이고 안정적인 네트워크 커뮤니케이션 논리를 작성하는 데 도움이됩니다. 다중화 핸들 또는 Curl_multi를 사용하면 리소스를 절약 할뿐만 아니라 요청 성능을 크게 향상시킬 수 있습니다.

합리적으로 연결 수명주기를 관리하는 것은 시스템 처리량을 향상시키는 핵심 단계입니다. 이 기사가 실제 프로젝트에서 최적화하도록 영감을주기를 바랍니다.