PHP에서 Curl_multi_* 함수는 요청의 효율성을 향상시키기 위해 여러 CURL 요청을 동시에 시작하는 데 사용됩니다. 그러나 Curl_Multi_Close를 호출하여 여러 컬 세션을 종료하면 함수가 모든 관련 핸들을 닫으므로 더 이상 요청의 반환 결과를 얻을 수 없습니다. Curl_Multi_Close를 호출 한 후에도 각 요청의 반환 결과를 얻으려면 일부 트릭이 필요합니다.
이 기사에서는 curl_multi_close 이후 모든 요청의 결과를 올바르게 얻는 방법을 설명합니다.
curl_multi_close를 호출 한 후 각 컬 리 요청의 응답 내용은 curl_multi_getContent를 통해 얻을 수 있습니다. 반환 된 모든 결과를 올바르게 얻으려면 CURL 세션을 마감하기 전에 각 요청의 결과가 보존되도록해야합니다.
다음은 전체 예입니다.
<?php
// 초기화cURL핸들
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$multiCurl = curl_multi_init();
$curlHandles = [];
// 각각에 대해URL만들다cURL핸들并添加到多重请求队列
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 반환 된 콘텐츠를 얻으십시오
curl_multi_add_handle($multiCurl, $ch);
$curlHandles[] = $ch;
}
// 모든 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($multiCurl, $running);
curl_multi_select($multiCurl);
} while ($running > 0);
// 각 요청의 결과를 얻으십시오
$responses = [];
foreach ($curlHandles as $ch) {
$responses[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($multiCurl, $ch); // 从多重请求队列中移除핸들
}
// 폐쇄cURL여러 대화
curl_multi_close($multiCurl);
// 각 요청에 대한 반환 결과를 출력하십시오
foreach ($responses as $response) {
echo $response . "\n";
}
?>
여러 요청 핸들 초기화 :
먼저 모든 URL을 요청할 $ URL 배열을 정의합니다. 이 예에서는 모든 URL이 gitbox.net 도메인 이름으로 대체됩니다.
그런 다음 각 URL에 대해 컬 핸들 $ ch를 생성하고 여러 컬 세션에 추가합니다.
요청을 실행하십시오 .
curl_multi_exec ()를 사용하여 세션에 추가 된 모든 요청을 실행하십시오. 우리는 curl_multi_select ()를 사용하여 요청이 완료 될 때까지 유휴 상태가되지 않도록합니다.
요청 결과를 얻으십시오 .
모든 요청이 완료된 후 Curl_multi_getContent ($ ch)를 사용하여 각 요청의 반환 내용을 가져 와서 $ zeses 배열에 저장합니다.
정리 :
Curl_multi_Remove_handle ($ multicurl, $ ch)을 사용하여 여러 세션에서 각 컬 핸들을 제거하고 Curl_multi_Close ()를 호출하여 전체 컬 세션을 닫습니다.
출력 응답 내용 :
마지막으로 $ reses 배열을 반복하고 각 요청의 응답 내용을 출력하십시오.
비동기 처리 : Curl_multi_* 함수의 가장 큰 장점 중 하나는 동시에 여러 요청을 보낼 수 있다는 것입니다. 이는 특히 동시 요청에 유용합니다. 다중 요청 시나리오에서도 Curl_multi_getContent는 각 요청의 반환 결과를 올바르게 얻을 수 있습니다.
요청 시간 초과 처리 : 실제 시나리오에서는 서버 응답이 느리기 때문에 다른 요청을 차단하는 요청을 피하기 위해 Curlopt_Timeout 과 같은 각 요청에 대한 타임 아웃 옵션을 설정해야 할 수도 있습니다.
오류 처리 : CURL을 사용할 때는 요청이 성공했는지 확인하고 Curl_ERRRNO ($ CH)를 사용하여 오류 코드를 가져와 요청의 문제를 식별하는 데 도움이됩니다.