Curl_multi_* 함수는 PHP에서 동시 HTTP 요청에 CURL 확장을 사용할 때 적절한 지원을 제공합니다. 특히, 두 가지 함수 curl_multi_close 및 curl_getInfo는 종종 여러 요청의 응답을 처리하기 위해 함께 사용해야합니다. 그러나 실제 개발에서 개발자는 특히 Curl_GetInfo를 사용하여 각 요청에 대한 응답 정보를 얻을 때 일부 함정에 직면 할 수 있습니다. 조심하지 않으면 예기치 않은 오류가 발생하거나 올바른 정보를 얻을 수 없습니다.
curl_multi_close는 여러 컬 세션 핸들을 닫는 데 사용됩니다. 요청이 완료되면 모든 리소스를 자유롭게하려면이 기능을 호출해야합니다. Curl_GetInfo를 사용하여 세션을 마치기 전에 요청의 자세한 정보를 얻는 경우 문제가 발생할 수 있습니다. 세션을 마감 한 후이 세션 핸들과 관련된 리소스가 파괴되며 Curl_getInfo를 호출하여 올바른 응답 정보를 얻을 수 없습니다.
// 샘플 코드:잘못된 방법
$mh = curl_multi_init();
$ch1 = curl_init("https://gitbox.net/api/v1/resource1");
$ch2 = curl_init("https://gitbox.net/api/v1/resource2");
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
// 실수:세션 핸들을 닫기 전에 호출되었습니다 curl_getinfo
$info1 = curl_getinfo($ch1); // 여기에서 오류가 발생합니다,세션이 종료 되었기 때문에
$info2 = curl_getinfo($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
위의 예에서는 curl_multi_close 전에 curl_getInfo를 호출했으며 반환 된 정보를 더 이상 사용할 수 없으며 PHP 오류로 이어질 수도 있습니다.
위의 문제를 피하려면 curl_multi_close를 호출하기 전에 curl_getInfo를 사용하여 각 요청에 대한 응답 정보를 얻어야합니다. 수정 후 올바른 데모는 다음과 같습니다.
// 올바른 방법
$mh = curl_multi_init();
$ch1 = curl_init("https://gitbox.net/api/v1/resource1");
$ch2 = curl_init("https://gitbox.net/api/v1/resource2");
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
// 옳은:세션을 마치기 전에 응답 정보를 얻으십시오
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
// 이제 안전하게 사용할 수 있습니다 $info1 그리고 $info2 그것은
이 수정 된 버전에서는 모든 세션 핸들을 닫기 전에 curl_getInfo를 통해 각 요청에 대한 응답 정보를 얻을 수 있습니다. 이렇게하면 세션 핸들을 닫은 후 이미 릴리스 된 리소스에 액세스하려고하지 않아 오류가 발생합니다.
여러 요청을 동시에 보내고 각 요청에 대해 응답 정보를 얻으려면 일반적으로 루프를 사용합니다. 이 시점에서 Curl_Multi_Close 전에 요청 된 각 Curl_GetInfo 가 얻어야합니다. 그렇지 않으면 리소스 손실이 발생합니다.
// 옳은的做法:루프를 사용하여 각 요청에 대한 정보를 하나씩 얻습니다.
$mh = curl_multi_init();
$channels = [];
$urls = [
"https://gitbox.net/api/v1/resource1",
"https://gitbox.net/api/v1/resource2"
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_multi_add_handle($mh, $ch);
$channels[] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
foreach ($channels as $ch) {
$info = curl_getinfo($ch); // 여기에서 정보를 하나씩 얻으십시오
// 거래하십시오 $info
}
foreach ($channels as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
이 예에서는 배열을 사용하여 각 컬 세션 핸들을 저장하고 curl_multi_close 전에 각 요청에 대한 응답 정보를 하나씩 얻습니다. 이 접근법은 앞에서 언급 한 문제를 피합니다.
때로는 모든 요청이 동시에 완료되지는 않습니다. 미완성 요청에서 Curl_GetInfo를 호출하지 않으려면 Curl_Multi_Select 함수를 사용하여 완료된 요청을 감지하여 완료된 요청에서 curl_getInfo 만 호출 할 수 있습니다.
// 더 복잡한 상황:사용 curl_multi_select 거래하십시오完成的请求
$mh = curl_multi_init();
$channels = [];
$urls = [
"https://gitbox.net/api/v1/resource1",
"https://gitbox.net/api/v1/resource2"
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_multi_add_handle($mh, $ch);
$channels[] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // 요청이 완료되기를 기다리십시오
}
} while ($active);
foreach ($channels as $ch) {
$info = curl_getinfo($ch); // 완료된 요청 정보를 여기에서 받으십시오
// 거래하십시오 $info
}
foreach ($channels as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
Curl_Multi_Select를 사용하면 요청이 완료 될 때 정보가 얻어 지도록하여 대기 또는 시간 초과 문제로 인한 데이터 손실을 피할 수 있습니다.
php에서 curl_multi_* 함수를 사용하는 경우 Curl_getInfo 및 Curl_Multi_Close는 일반적으로 사용되는 도구입니다. 일반적인 함정을 피하기위한 핵심은 여러 세션을 닫기 전에 curl_getinfo를 통해 각 세션에 대한 응답 정보가 얻어 졌는지 확인하는 것입니다. 올바른 코드 구조 및 요청 관리를 통해 프로그램의 안정성과 정확성을 보장 할 수 있습니다.