현재 위치: > 최신 기사 목록> Curl_Close 이후 컬 자원이 여전히 메모리를 차지하는 이유는 무엇입니까? 그것을 해결하는 방법?

Curl_Close 이후 컬 자원이 여전히 메모리를 차지하는 이유는 무엇입니까? 그것을 해결하는 방법?

gitbox 2025-05-18

PHP에서 Curl은 다른 서버와의 데이터 교환을위한 강력한 라이브러리입니다. 이를 통해 개발자는 HTTP 요청을 통해 데이터를 보내고받을 수 있습니다. CURL 요청을 완료 한 후 일반적으로 CURL_CLOSE 기능을 사용하여 CURL 세션을 닫고 리소스를 확보합니다.

 $ch = curl_init("https://gitbox.net/some-api-endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

이 예에서 Curl_Close ($ CH) 가 호출 된 후 $ ch 변수가 차지하는 리소스가 해제 될 것으로 예상됩니다.

메모리가 완전히 풀리지 않은 이유는 무엇입니까?

Curl_Close를 사용한 후에도 메모리가 여전히 점유 된 경우 이유의 여러 측면이있을 수 있습니다. 몇 가지 일반적인 이유는 다음과 같습니다.

  1. PHP 메모리 관리 메커니즘
    PHP는 쓰레기 수집을 지연시키는 메커니즘을 사용합니다. curl_close가 호출 되더라도 메모리의 해제는 즉시 발생하지 않을 수 있습니다. PHP는 이러한 리소스를 재활용하기 전에 스크립트 실행이 끝날 때까지 기다릴 수 있습니다.

  2. curl_initcurl_close 여러 번
    동일한 스크립트에서 컬 리소스를 여러 번 초기화하고 닫으면 PHP는 특히 많은 요청이있을 때 즉시 이전 리소스를 릴리스하지 못할 수 있습니다. 새 컬 세션이 생성 될 때마다 일정량의 메모리를 차지하며 스크립트 실행이 완료 될 때까지 철저히 정리되지 않습니다.

  3. 컬 리소스가 완전히 닫히지 않았습니다 <br> Curl_Close를 호출하기 전에 오류가 발생하거나 CURL 세션이 올바르게 실행되었는지 확인하지 않으면 리소스가 완전히 해제되지 않을 수 있습니다. 예를 들어, curl_exec은 curl_error를 통해 오류 메시지를 얻지 않고 false를 반환합니다.

컬 메모리를 완전히 자유롭게하는 방법?

Curl_Close는 리소스를 자유롭게하는 데 사용되지만 때로는 메모리를 완전히 해제하기에 충분하지 않습니다. 시도하는 몇 가지 방법은 다음과 같습니다.

1. UNSET를 사용하여 변수를 지우십시오

UNSET를 사용하면 PHP 변수를 지우는 데 도움이 될 수 있습니다. Curl_Close가 실행 되더라도 Unset은 변수가 더 이상 리소스를 참조하지 않도록합니다.

 curl_close($ch);
unset($ch);

2. GC_COLLECT_CYCLES를 사용하여 쓰레기 수집을 강제로합니다

PHP에서는 쓰레기 수집이 자동으로 수행되지만 GC_Collect_Cycles를 수동으로 호출하여 자원이 제 시간에 재활용되도록 가비지 컬렉션을 수행해야합니다.

 curl_close($ch);
unset($ch);
gc_collect_cycles();

3. 메모리 사용을 분석하십시오

메모리 사용이 여전히 너무 높다는 것을 알게되면 memory_get_usagememory_get_peak_usage를 사용하여 메모리 사용을 분석 할 수 있습니다. 이것은 메모리가 실제로 해제되는지 더 명확하게 이해하는 데 도움이됩니다.

 echo "현재 메모리 사용: " . memory_get_usage() . " bytes";
echo "최대 메모리 사용: " . memory_get_peak_usage() . " bytes";

4. 배치로 여러 요청을 처리합니다

많은 수의 컬 요청을 실행하는 경우 한 번에 모든 요청을 실행하는 대신 요청을 배치로 처리하는 것을 고려하십시오. 이는 메모리 관리에 도움이 될뿐만 아니라 서버로드를 줄입니다.

 // 배치로 여러 요청을 처리합니다
$urls = [
    "https://gitbox.net/api1",
    "https://gitbox.net/api2",
    "https://gitbox.net/api3",
];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
    unset($ch);
}

5. Curl을 사용하여 멀티 스레드

여러 요청을 실행 해야하는 상황의 경우 CURL의 다중 스레드 기능 (예 : Curl_Multi_* 시리즈 기능)을 사용하면 메모리 사용량을 효과적으로 줄이고 요청을 가속화 할 수 있습니다. 멀티 스레딩은 여러 요청을 동시에 실행하여 단일 요청의 메모리 사용량을 줄일 수 있습니다.

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

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

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

foreach ($handles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);