현재 위치: > 최신 기사 목록> 루프에서 Curl_Close를 올바르게 사용하여 메모리 누출을 피하십시오

루프에서 Curl_Close를 올바르게 사용하여 메모리 누출을 피하십시오

gitbox 2025-05-28

Curl은 서버와 데이터를 교환하는 도구입니다. HTTP, HTTPS, FTP 등을 포함한 다양한 프로토콜을 지원합니다. PHP의 CURL Extension은 간단한 인터페이스를 제공하여 요청을 쉽게 시작하고 응답을 수신하며 관련 오류를 처리 할 수 ​​있습니다.

여러 HTTP 요청을 할 때 CURL 의 리소스가 제한되어 있으므로 요청이 완료된 후에 이러한 리소스가 제 시간에 해제되어야합니다. 이것은 curl_close () 함수를 호출하여 달성됩니다. 연결을 닫지 않고 HTTP 요청이 루프에서 자주 시작되면 메모리 누출과 서버 성능이 저하됩니다.

컬의 기본 사용

컬 요청을 할 때는 일반적으로 다음 단계를 따릅니다.

  1. 컬 세션을 초기화하십시오.

  2. 요청 매개 변수를 설정합니다.

  3. 요청을 실행하고 응답을 받으십시오.

  4. 컬 세션을 닫으십시오.

 $ch = curl_init(); // 초기화 cURL 세션
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint"); // 요청을 설정하십시오 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 응답 내용을 얻으십시오
$response = curl_exec($ch); // 요청을 실행하십시오
curl_close($ch); // 关闭세션

루프의 메모리 누출 문제

요청이 루프에서 자주 시작되면 각 요청은 연결 정보를 저장하기 위해 메모리를 할당합니다. 루프의 각 반복 중에 컬 세션이 정시에 닫히지 않으면 메모리 누출이 발생합니다. 그렇게하면 PHP 스크립트가 너무 많은 메모리를 소비 할 수있어서 결국 성능 문제가 발생하고 서버에서 충돌 할 수 있습니다.

예를 들어, 컬 세션을 올바르게 닫지 않고 루프의 요청이 축적되어 점점 더 많은 메모리를 소비합니다.

 // 오류 데모:루프에서 닫히지 않습니다 cURL 세션
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    // 전화하는 것을 잊었습니다 curl_close()
}

올바른 컬 사용

메모리 누출을 피하려면 각 요청이 완료된 후 CURL_CLOSE () 함수가 호출되어야합니다. 가장 쉬운 방법은 Curl_Close ()를 루프 내부에 넣어 각 요청이 완료된 후 리소스가 해제되도록하는 것입니다.

 // 올바른 데모:루프가 닫힙니다 cURL 세션
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch); // 及时关闭세션
}

각 요청이 완료된 후 CURL 세션을 마감하면 PHP 메모리가 낭비되지 않고 각 HTTP 요청에 대한 리소스가 제 시간에 해당되는지 확인하십시오.

멀티 스레드 컬을 사용하여 성능 병목 현상을 줄입니다

많은 수의 요청을 처리 할 때 단일 스레드 루프가 매우 느릴 수 있습니다. 많은 수의 요청을 처리해야하고 실행 효율성을 향상시켜야하는 경우 멀티 스레드 컬 (Concurrent Curl)을 사용하는 것을 고려할 수 있습니다. 이는 요청 시간을 크게 줄이고 빈번한 I/O 운영으로 인한 병목 현상을 피할 수 있습니다.

 // 멀티 스레딩 사용 cURL 성능을 최적화합니다
$mh = curl_multi_init(); // 초기화 cURL 多线程세션
$handles = [];

for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $ch); // 각각을 넣으십시오 cURL 句柄添加到多线程세션中
    $handles[] = $ch;
}

// 다중 스레드 요청을 수행하십시오
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

// 모두 닫으십시오 cURL 세션
foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh); // 关闭多线程세션

이를 통해 메인 프로그램을 차단하지 않고 한 프로세스에서 여러 요청을 병렬로 처리 할 수 ​​있으므로 성능이 크게 향상됩니다.