PHP의 컬 확장을 사용하는 경우 Curl_multi_* 일련의 함수는 여러 HTTP 요청을 동시에 실행할 수 있습니다. curl_multi_exec ()을 통해 배치로 요청을 보내고 curl_multi_close ()를 사용하여 핸들을 닫습니다. 이러한 기능은 강력하지만 curl_setopt () 와 함께 사용될 때 약간의 함정이 발생하기 쉽습니다. 아래에서 우리는 몇 가지 일반적인 실수와 피하는 방법에 대해 논의 할 것입니다.
Curl_Multi_Exec ()를 사용하여 여러 요청을 배치하는 경우 일반적으로 각 요청에 대한 개별 옵션을 설정해야합니다. 여러 핸들을 추가 할 때 curl_setopt () 가 올바르게 설정되지 않으면 요청이 실패하거나 잘못된 결과를 반환 할 수 있습니다.
$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);
curl_multi_close () 및 curl_close () 는 CURL 핸들을 닫는 데 사용되지만 동작 범위는 다릅니다. curl_close ()는 단일 컬 핸들 만 닫히고 curl_multi_close () 는 여러 컬어 요청에서 모든 핸들을 닫습니다. 이 두 기능을 잘못 사용하면 리소스가 올바르게 릴리스되지 않거나 프로그램이 후속 요청에서 예외가 발생할 수 있습니다.
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);
때로는 개발자가 Curl_Multi_Exec ()를 사용하여 여러 요청을 보내면 요청이 올바르게 완료되기를 기다리지 않기 때문에 연결을 조기에 닫을 수 있습니다. curl_multi_exec ()가 비동기 적으로 실행되므로 모든 요청이 완료되었는지 확인한 다음 Curl_Multi_Close () 를 호출해야합니다.
// 没有等待请求完成就关闭핸들
curl_multi_close($multiHandle);
$ running 매개 변수를 감지하여 연결을 닫기 전에 모든 요청이 완료되었는지 확인하십시오.
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running > 0);
curl_multi_close($multiHandle);
경우에 따라 개발자는 동일한 컬 핸들을 재사용하려고 시도하여 오류 또는 성능 문제를 쉽게 요청할 수 있습니다. 새 요청이 전송 될 때마다 새 컬 핸들이 생성되고 다른 옵션을 설정해야합니다.
$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');
curl_multi_exec ()가 요청을 실행하면 다양한 네트워크 또는 서버 오류가 발생할 수 있습니다. 이러한 오류를 올바르게 처리하려면 Curl_Error () 및 Curl_Errno ()를 오류 디버깅에 사용해야합니다.
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);
}
}