CURL_MULTI_* 시리즈 기능은 동시 요청을 위해 PHP의 CURL 확장을 사용할 때 매우 일반적입니다. curl_multi_close ()는 자원을 해제하고 CURL 핸들 컬렉션을 닫는 데 사용되는 기능입니다. 그러나 많은 개발자들이 리디렉션 (예 : 301, 302)을 포함한 응답을 다룰 때 당황 할 수 있습니다.
이 기사에서는 요청을 닫을 때 중요한 리디렉션 응답을 잃지 않도록 원칙과 실용적인 관점에서 Curl_Multi_Close ()를 올바르게 사용하도록 가르칩니다.
우선 Curl_multi_Close ($ multi_handle) 의 주요 기능은 다음과 같습니다.
멀티 핸들러를 닫으십시오
모든 관련 리소스를 동시에 해제하십시오
중요한 팁 :
curl_multi_close () 는 리소스 청소를 담당하며 자동으로 리디렉션을 처리하지 않습니다 .
리디렉션 처리는 요청 실행 단계에서 완료해야합니다 (예 : Curl_Multi_Exec () 이전의 옵션 설정 등).
마감 후 리디렉션 정보를 포함하여 더 이상 요청 응답 데이터를 얻을 수 없습니다.
따라서 curl_multi_close ()를 호출하기 전에 모든 요청이 완전히 실행되었으며 필요한 응답이 읽혀 졌는지 확인해야합니다.
Curl이 리디렉션을 올바르게 따르고 닫기 전에 최종 응답을 얻으려면 다음을 수행해야합니다.
자동 후속 리디렉션을 허용하도록 컬 옵션을 설정하십시오 .
요청을 완전히 실행 하고 필요한 모든 데이터를 검색하십시오.
마지막으로, Curl_multi_Close ()가 자원을 해제하도록 호출됩니다.
<?php
// 다중 핸들 프로세서를 만듭니다
$multiHandle = curl_multi_init();
// 별도를 초기화하십시오 cURL 세션
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 자동 후속 리디렉션을 허용합니다
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 최대를 따르십시오5리디렉션
// 将세션添加到多句柄处理器
curl_multi_add_handle($multiHandle, $ch);
// 요청을 실행하십시오
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > 0) {
echo "cURL Error: " . curl_multi_strerror($status);
}
// 활성 연결을 기다리고 있습니다
curl_multi_select($multiHandle);
} while ($running > 0);
// 닫기 전에 컨텐츠와 정보를 얻으십시오
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
// 응답 내용 인쇄
echo "Final URL: " . $info['url'] . PHP_EOL;
echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
echo "Response Body: " . $response . PHP_EOL;
// 청소
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
curl_multi_close($multiHandle);
?>
curlopt_followlocation은 자동으로 리디렉션을 처리하도록 true 로 설정되었습니다.
curl_multi_exec이 완전히 실행 된 후 Curl_multi_getContent () 및 curl_getInfo ()를 사용하여 최종 응답 정보를 얻으십시오.
curl_multi_close ()는 데이터를 완전히 가져온 후에 만 안전하게 호출 할 수 있습니다.
Curl_multi_Close () 전에이 단계를 올바르게 처리하지 않으면 리디렉션 된 최종 응답 데이터를 얻을 수 없습니다.
다음은 실수가 발생하기 쉬운 방법입니다.
<?php
$multiHandle = curl_multi_init();
$ch = curl_init('https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
// 실수:실행이 완료되지 않은 경우 직접 닫으십시오
curl_multi_close($multiHandle);
$response = curl_multi_getcontent($ch); // 이 시점에서 얻은 내용은 비어 있거나 정의되지 않았을 수 있습니다.
?>
문제 분석 :
요청이 완료되기 전에 멀티 핸들이 닫히므로 후속 리디렉션 응답 및 데이터를 올바르게 얻을 수 없습니다.
curl_multi_close ()는 리디렉션을 처리하지 않으며 자원을 청소하는 것만 담당합니다.
curlopt_followlocation을 설정하여 리디렉션을 설정해야하며 닫기 전에 요청 처리가 완료됩니다.
curl_multi_close () 전에 필요한 모든 데이터를 추출 하십시오.
올바른 순서 (실행 → 컨텐츠 가져 오기 → 핸들 제거 → 멀티 닫기)로 요청이 완료되고 데이터가 손실되지 않도록하십시오.
이러한 세부 사항을 마스터하면 특히 응답을 방향 전환 할 때 복잡한 동시 요청을 쉽게 처리 할 수 있습니다!