현재 위치: > 최신 기사 목록> curl_multi_close 전에 잘못된 요청이 전송되는 것을 피하는 방법

curl_multi_close 전에 잘못된 요청이 전송되는 것을 피하는 방법

gitbox 2025-05-12

동시 요청에 PHP의 Curl_Multi_* 시리즈 기능을 사용하는 경우, 부적절하게 처리되면 Curl_Multi_Close () 호출 전에 유효하지 않거나 잘못된 요청을 보내기 쉽고 낭비되는 리소스 및 서버 오류가 발생합니다. 다중 핸들을 닫기 전에 모든 요청이 유효하고 올바른지 확인하려면 다음 측면에서 시작하여 최적화 할 수 있습니다.

1. 요청을 추가하기 전에 각 개별 컬 핸들을 엄격하게 확인하십시오.

URL이 올바르게 형식화되도록 Curl_Multi_ADD_HANDLE 에 추가되기 전에 각 개별 CURL 요청 ( CURL_INIT 로 초기화 한 핸들)을 완전히 점검해야합니다. 예를 들어 URL이 올바르게 형식화되고 필요한 요청 헤더가 손상되지 않으며 타임 아웃 매개 변수가 합리적입니다.

샘플 코드 :

 function createCurlHandle(string $url): ?\CurlHandle
{
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        return null;
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 시간 초과 설정
    return $ch;
}

2. Curl_Multi_Exec 의 실행 상태를 올바르게 모니터링하십시오

멀티 스레드 실행 중에 실행 상태를 통과하여 연결을 맹목적으로 닫지 않고 모든 핸들이 올바르게 응답 할 수 있도록해야합니다.

예:

 $urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3"
];

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

foreach ($urls as $url) {
    $ch = createCurlHandle($url);
    if ($ch !== null) {
        curl_multi_add_handle($multiHandle, $ch);
        $curlHandles[] = $ch;
    }
}

$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > CURLM_OK) {
        // 기록 오류,또는 필요에 따라 방해합니다
        break;
    }
    // 허용하다CPU휴식을 취하십시오
    curl_multi_select($multiHandle);
} while ($running > 0);

3. 핸들을 닫기 전에 각 요청의 반환 상태를 확인하십시오.

공식적으로 curl_multi_close ()를 호출하기 전에 모든 개별 핸들을 가로 지르고 리턴 코드 ( Curlinfo_http_code ) 및 기타 정보를 확인하고 다시 시도 해야하는지 또는 실패했는지 여부를 결정해야합니다.

 foreach ($curlHandles as $ch) {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpCode !== 200) {
        // 예외를 처리하십시오,예를 들어 로깅、다시 제출 요청 등
        echo "요청이 실패했습니다,HTTP상태 코드:" . $httpCode . PHP_EOL;
    }
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);

4. 요약

다중 요청 동시성이 수행되는 시나리오에서는 각 요청 수명주기를 올바르게 관리하는 것이 매우 중요합니다. 초기화 단계에서 시작하는 매개 변수를 엄격하게 검증하고 실행 중 상태를 모니터링하고 끝 이전에 반환 값을 철저히 확인하면이 일련의 단계는 잘못된 요청으로 인한 리소스 폐기물 및 서버 측 압력을 최소화 할 수 있습니다. 예외 처리 메커니즘과 함께 Curl_Multi_Select () 를 합리적으로 사용하면 CURL_MULTI 호출은 효율적이고 안정적 ​​일 수있어 전체 시스템의 신뢰성을 향상시킬 수 있습니다.