현재 위치: > 최신 기사 목록> curl_close를 사용할 때 모든 열린 컬 핸들이 닫혀 있는지 어떻게 확인합니까?

curl_close를 사용할 때 모든 열린 컬 핸들이 닫혀 있는지 어떻게 확인합니까?

gitbox 2025-05-20

PHP의 네트워크 요청에 CURL을 사용하는 것은 특히 외부 API와 통신해야 할 때 매우 일반적인 관행입니다. 그러나 사용한 컬 핸들을 올바르게 닫지 않으면 메모리 누출이나 자원 낭비가 발생할 수 있습니다. 이 기사에서는 Curl_Close 기능을 올바르게 사용하여 모든 열린 핸들, 특히 동시 요청 또는 루프 작업을 수행 할 때 올바르게 닫히도록하는 방법을 자세히 설명합니다.

기본 컬 사용

가장 기본적인 사용 시나리오에서 컬 핸들을 닫는 것은 비교적 간단합니다.

 $ch = curl_init('https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

이 코드는 요청이 완료된 직후 Curl_Close를 사용하여 핸들을 닫습니다.

루프에서 컬을 사용하십시오

여러 요청을 보내야하는 경우 일반적으로 루프를 사용하며 닫는 핸들을 쉽게 놓칠 수 있습니다.

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

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    // 잊어 버린 경우 curl_close($ch),각 반복은 릴리스되지 않은 리소스를 남깁니다
}

이 경우 각 반복 후에 핸들은 수동으로 닫아야합니다.

 foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch); // 손잡이를 닫으십시오
}

Multithreading (Curl_multi_*)을 사용할 때 닫는 올바른 방법

curl_multi_init을 사용하여 동시 요청을 구현하는 경우, 마감 핸들의 순서는 다음에주의를 기울여야합니다.

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

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

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

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

// 모든 핸들을 제거하고 닫습니다
foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch); // 종료하는 주요 단계는 다음과 같습니다
}

curl_multi_close($multiHandle);

여기에서 curl_close ($ ch) 외에도 먼저 curl_multi_remove_handle을 호출하여 핸들을 안전하게 닫으려면 제거해야합니다.

자동 리소스 청소 : 기능 캡슐화를 사용합니다

핸들을 닫는 것을 수동으로 잊어 버리지 않으려면 기능의 끝에서 리소스가 닫히도록 함수의 요청 프로세스를 캡슐화 할 수 있습니다.

 function fetchUrl($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch); // 기능 내부에서 리소스가 닫혀 있는지 확인하십시오
    return $response;
}

$data = fetchUrl('https://gitbox.net/api/config');

제안 요약

  1. 요청이 실패하더라도 항상 curl_close ()를 호출하여 핸들을 닫으십시오 .

  2. 다중 핸들 동시성을 사용할 때는 curl_close를 놓치지 마십시오.

  3. curl_multi_*를 사용하는 경우 Curl_multi_Remove_handle을 먼저 사용한 다음 Curl_Close를 사용하십시오.

  4. 청소 작업이 내부적으로 수행되고 누락의 위험을 줄이기 위해 요청 로직을 기능으로 가능한 한 캡슐화하십시오.

리소스를 올바르게 공개하면 스크립트의 효율성과 견고성을 향상시킬 수있을뿐만 아니라 서버의 리소스 누출 위험을 피할 수 있습니다. 다중 스레드 또는 대규모 요청이 요청되는 시나리오에서 특히 중요합니다. 좋은 코딩 습관과 구조 설계를 사용하면 모든 컬 핸들이 올바르게 닫히도록 쉽습니다.