현재 위치: > 최신 기사 목록> curl_multi_close가 요청의 중간 프로세스를 방해하지 않도록하는 방법

curl_multi_close가 요청의 중간 프로세스를 방해하지 않도록하는 방법

gitbox 2025-05-29

PHP에서 CURL 확장을 사용하는 경우 Curl_multi_* 함수는 일반적으로 여러 동시 요청을 처리하는 데 사용됩니다. 이러한 기능은 특히 여러 HTTP 요청이 동시에 전송 될 때 프로그램의 성능을 크게 향상시킬 수 있습니다. 그러나 curl_multi_close 함수를 사용할 때 일부 개발자는 요청 처리에서 간섭 문제에 직면하여 요청이 올바르게 완료되지 않거나 오류를 반환 할 수 있습니다.

이 기사는 요청 처리의 간섭을 피하는 방법을 살펴보고 실용적인 코드 예제 및 솔루션을 공유합니다.

1. curl_multi_* 함수의 개요

PHP는 CURL_MULTI_* 기능을 제공하여 여러 동시 커플 요청을 수행합니다. 주요 기능은 다음과 같습니다.

샘플 코드

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// 요청을 실행하십시오
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
} while ($running);

// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// 손잡이를 닫으십시오
curl_multi_close($multiHandle);

?>

2. Curl_multi_Close 문제

curl_multi_close 기능은 편리한 청소 기능이지만, 요청 처리의 마지막 단계에서, 특히 요청이 완료되지 않을 때 Curl_multi_close가 호출 될 때 때때로 방해 할 수 있습니다. 이 간섭으로 인해 일부 요청이 올바르게 완료되지 않거나 수신 된 응답이 불완전합니다.

간섭의 일반적인 원인

  1. 동시 요청의 완료 시간은 일관되지 않습니다 . 요청의 다른 응답 시간이 다르기 때문에 Curl_Multi_Close가 호출되면 일부 요청이 완료되지 않았으므로 요청이 사전에 닫히게됩니다.

  2. 리소스 릴리스 문제 : 경우에 따라 경우에 따라 Resource가 완전히 릴리스되기 전에 Curl_Multi_Close 호출은 다른 요청에 영향을 미치거나 연결이 연결이 끊어 질 수 있습니다.

3. 간섭을 피하는 방법?

curl_multi_close 함수의 요청 처리에서 간섭을 피하기 위해 다음과 같은 전략을 채택 할 수 있습니다.

3.1 모든 요청이 완료되었는지 확인하십시오

curl_multi_close를 호출하기 전에 모든 요청이 완료되었는지 확인하십시오. curl_multi_exec 에 의해 반환 된 실행 상태를 확인하여 모든 요청이 완료되었는지 확인할 수 있습니다. curl_multi_close는 모든 요청이 처리 될 때만 호출해야합니다.

개선 된 코드 예 :

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// 요청을 실행하십시오
$running = null;
do {
    $mrc = curl_multi_exec($multiHandle, $running);
    if ($mrc > 0) {
        echo "CURL exec error: " . curl_multi_strerror($mrc);
    }
} while ($running);

// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// 손잡이를 닫으십시오
curl_multi_close($multiHandle);

?>

3.2 Curl_multi_Select를 사용하여 성능을 향상시킵니다

경우에 따라 Curl_Multi_Select ()를 사용하여 요청 처리 성능을 최적화 할 수 있습니다. CURL_MULTI_EXEC을 지속적으로 폴링하는 대신 CURL 요청이 완료되기를 기다리는 동안 프로세스를 차단할 수있어 CPU 사용량을 줄이고 요청의 원활한 처리를 보장합니다.

Code example:

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// 여러 요청 핸들을 초기화합니다
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// 요청을 실행하십시오并使用 curl_multi_select 성능 향상
$running = null;
do {
    $mrc = curl_multi_exec($multiHandle, $running);
    if ($mrc > 0) {
        echo "CURL exec error: " . curl_multi_strerror($mrc);
    }
    curl_multi_select($multiHandle);
} while ($running);

// 응답 데이터를 얻습니다
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// 손잡이를 닫으십시오
curl_multi_close($multiHandle);

?>

4. 요약

요청 처리의 간섭을 피하려면 모든 요청이 완료되고 응답이 올바르게 반환되었는지 확인해야합니다. 요청의 실행 상태를 모니터링하고 Curl_Multi_Select를 사용하여 성능을 최적화하고 가능한 간섭을 피하기 위해 요청이 완료된 후 CURL_MULTI_CLOSE가 호출되는지 확인할 수 있습니다.

이러한 방법을 통해 PHP의 동시 요청의 안정성과 성능을 효과적으로 개선하여 요청 처리 프로세스가 원활하고 불필요한 간섭이 없도록합니다.