현재 위치: > 최신 기사 목록> Curl_Close 원인 프로그램 충돌 또는 자원 누출에 대한 여러 번의 호출을 피하는 방법은 무엇입니까?

Curl_Close 원인 프로그램 충돌 또는 자원 누출에 대한 여러 번의 호출을 피하는 방법은 무엇입니까?

gitbox 2025-05-21

Curl_Init ()를 사용하여 CURL 세션을 만들 때 PHP는 시스템 리소스 (예 : 메모리 및 네트워크 연결)를 세션에 할당합니다. 요청이 완료되면 Curl_Close ()를 사용하여 세션을 닫고 이러한 리소스를 제거해야합니다. Curl_Close ()가 부적절한 시간에 자주 호출되는 경우, 특히 여러 요청 처리 중에 문제가 발생할 수 있습니다.

샘플 코드 :

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

위의 코드에서 Curl_Close ($ CH)는 요청이 완료된 후 연결 리소스가 릴리스되도록합니다. 그러나 자주 또는 불충분 한 전화는 프로그램의 안정성에 영향을 줄 수 있습니다.

2. 루프에서 curl_close () 에 대한 빈번한 호출을 피하십시오

여러 동시 컬 요청을 실행할 때 각 요청 직후에 Curl_Close ()를 호출하지 않지만 모든 요청이 완료되고 세션이 균일하게 닫힐 때까지 기다리십시오. 이로 인해 자주 사용 및 자원 방출이 줄어들 수 있습니다.

샘플 코드 (잘못된 실습) :

 $urls = ['http://gitbox.net/api/data1', 'http://gitbox.net/api/data2', 'http://gitbox.net/api/data3'];
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);  // 종종 세션이 종종 있습니다
}

개선 방법 :

 $urls = ['http://gitbox.net/api/data1', 'http://gitbox.net/api/data2', 'http://gitbox.net/api/data3'];
$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 {
    $status = curl_multi_exec($multiHandle, $active);
    if ($active) {
        curl_multi_select($multiHandle);
    }
} while ($active);

// 모든 세션을 닫으십시오
foreach ($handles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);  // 모든 요청이 완료된 후 세션을 닫습니다
}

curl_multi_close($multiHandle);

이 개선 된 예에서는 모든 요청이 여러 핸들에서 처리됩니다. Curl_Close () 는 모든 요청이 완료된 후에 만 ​​호출되며 자주 리소스 릴리스 및 응용 프로그램을 피합니다.

3. 적절한 오류 처리 및 로깅을 사용하십시오

CURL 요청을하는 동안 오류가 발생하면 오류 메시지를 제 시간에 기록하는 것이 중요합니다. 적절한 로깅을 사용하면 자원 누출 또는 충돌의 원인을 빠르게 찾을 수 있습니다.

샘플 코드 :

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

if ($response === false) {
    error_log('cURL Error: ' . curl_error($ch));
}

curl_close($ch);

위의 코드에서는 Curl_Error ()를 통해 오류 정보를 얻고 CURL 요청에서 문제를 더 잘 처리하고 디버깅 할 수 있습니다.

4. 컬 구성을 최적화하십시오

합리적인 구성을 통해 CURL 요청 고장으로 인해 자주 리소스 애플리케이션 및 릴리스를 피할 수 있습니다. 예를 들어, 요청 시간 초과 및 적절한 재 시도 전략을 설정하면 유효하지 않은 요청 수가 줄어들어 Curl_Close () 에 대한 빈번한 호출이 더 줄어 듭니다.

샘플 코드 :

 $ch = curl_init('http://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);  // 시간 초과 설정
$response = curl_exec($ch);

if ($response === false) {
    // 재 시도 또는 로그
}

curl_close($ch);

이 코드에서는 요청이 오랫동안 차단되지 않도록 시간 초과 시간을 설정하여 프로그램 충돌 위험을 줄입니다.