현재 위치: > 최신 기사 목록> curl_multi_close curl_setopt를 사용할 때 일반적인 오류입니다

curl_multi_close curl_setopt를 사용할 때 일반적인 오류입니다

gitbox 2025-05-29

PHP의 확장을 사용하는 경우 Curl_multi_* 일련의 함수는 여러 HTTP 요청을 동시에 실행할 수 있습니다. curl_multi_exec ()을 통해 배치로 요청을 보내고 curl_multi_close ()를 사용하여 핸들을 닫습니다. 이러한 기능은 강력하지만 curl_setopt () 와 함께 사용될 때 약간의 함정이 발생하기 쉽습니다. 아래에서 우리는 몇 가지 일반적인 실수와 피하는 방법에 대해 논의 할 것입니다.

1. 루프에서 필요한 옵션을 설정하는 것을 잊었습니다

Curl_Multi_Exec ()를 사용하여 여러 요청을 배치하는 경우 일반적으로 각 요청에 대한 개별 옵션을 설정해야합니다. 여러 핸들을 추가 할 때 curl_setopt () 가 올바르게 설정되지 않으면 요청이 실패하거나 잘못된 결과를 반환 할 수 있습니다.

Error example:
 $ch1 = curl_init();
$ch2 = curl_init();

curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');

// 필요한 다른 옵션을 설정하는 것을 잊었습니다,좋다 CURLOPT_RETURNTRANSFER
해결책:

핸들에 필요한 옵션을 설정하십시오. 예를 들어:

 curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

2. curl_multi_close ()curl_close () 혼동

curl_multi_close ()curl_close () 는 CURL 핸들을 닫는 데 사용되지만 동작 범위는 다릅니다. curl_close ()는 단일 컬 핸들 만 닫히고 curl_multi_close () 는 여러 컬어 요청에서 모든 핸들을 닫습니다. 이 두 기능을 잘못 사용하면 리소스가 올바르게 릴리스되지 않거나 프로그램이 후속 요청에서 예외가 발생할 수 있습니다.

Error example:
 curl_multi_close($multiHandle); // 실수,왜냐하면 $multiHandle 여러 핸들을 닫아야합니다
해결책:

여러 요청을 사용하는 경우 Curl_Multi_Close ()를 사용하여 요청을 완료 한 후 여러 핸들을 닫고 각 핸들을 처리해야합니다.

 // 여러 요청을 수행하십시오
curl_multi_exec($multiHandle, $running);

// 각 개인을 닫습니다 cURL 핸들
curl_close($ch1);
curl_close($ch2);

// 올바르게 사용하십시오 curl_multi_close()
curl_multi_close($multiHandle);

3. 모든 요청이 완료되기를 기다리지 않고 연결을 닫습니다.

때로는 개발자가 Curl_Multi_Exec ()를 사용하여 여러 요청을 보내면 요청이 올바르게 완료되기를 기다리지 않기 때문에 연결을 조기에 닫을 수 있습니다. curl_multi_exec ()가 비동기 적으로 실행되므로 모든 요청이 완료되었는지 확인한 다음 Curl_Multi_Close () 를 호출해야합니다.

Error example:
 // 没有等待请求完成就关闭핸들
curl_multi_close($multiHandle);
해결책:

$ running 매개 변수를 감지하여 연결을 닫기 전에 모든 요청이 완료되었는지 확인하십시오.

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

curl_multi_close($multiHandle);

4. 컬 핸들을 잘못 재사용합니다

경우에 따라 개발자는 동일한 컬 핸들을 재사용하려고 시도하여 오류 또는 성능 문제를 쉽게 요청할 수 있습니다. 새 요청이 전송 될 때마다 새 컬 핸들이 생성되고 다른 옵션을 설정해야합니다.

Error example:
 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data1');

// 复用相同的핸들
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data2'); // 실수,应该创建新的핸들
해결책:

각 요청에 대한 새 컬 핸들을 작성하십시오.

 $ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');

5. 오류 처리 및 디버깅

curl_multi_exec ()가 요청을 실행하면 다양한 네트워크 또는 서버 오류가 발생할 수 있습니다. 이러한 오류를 올바르게 처리하려면 Curl_Error ()Curl_Errno ()를 오류 디버깅에 사용해야합니다.

Error example:
 curl_multi_exec($multiHandle, $running); // 요청을 실행하십시오,但没有处理실수
해결책:

각 요청이 완료되면 오류 메시지를 확인하고 출력합니다.

 // 요청을 실행하십시오
curl_multi_exec($multiHandle, $running);

// 실수处理
foreach ($handles as $ch) {
    if ($errno = curl_errno($ch)) {
        echo "cURL error: " . curl_error($ch);
    }
}