PHP에서 Curl_multi_* 일련의 함수는 여러 CURL 요청을 비동기 적으로 처리 할 수있는 기능을 제공합니다. 이는 여러 URL이 동시에 요청되고 결과를 기다리는 시나리오에 유용합니다. 이러한 비동기 요청에서 Curl_getInfo는 HTTP 상태 코드, 요청 된 URL, 전송 시간 등과 같은 각 요청에 대한 자세한 정보를 얻는 데 사용됩니다. 그러나 CURL_MULTI_CLOSE를 사용하여 멀티 -CURL 세션을 닫을 때 각 요청의 정보를 올바르게 얻고 처리하는 방법은 실제 개발에 대한 공통적이되었습니다.
이 기사는 Curl_Multi_Close를 사용하여 여러 요청을 처리 할 때 Curl_GetInfo를 통해 요청의 자세한 정보를 올바르게 얻는 방법에 대해 논의하고 부적절한 요청 종료 타이밍으로 인한 데이터 동기화 문제를 피합니다.
PHP에서 Curl_multi_* 함수를 사용하면 여러 개의 컬 요청을 동시에 시작하여 여러 스레드를 통해 병렬로 처리 할 수 있습니다. 예를 들어, curl_multi_init를 사용하여 컬 핸들 세트를 초기화하고 curl_multi_add_handle을 사용하여 여러 개의 컬 핸들을 추가 한 다음 curl_multi_exec을 통해 실행하고 모든 요청이 완료 될 때까지 기다립니다. 마지막으로 curl_multi_close를 사용하여 세션을 닫습니다.
간단한 예는 다음과 같습니다.
$mh = curl_multi_init(); // 초기화 multi curl 핸들
$ch1 = curl_init("http://gitbox.net/api/data1"); // 묻다 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // 묻다 2
curl_multi_add_handle($mh, $ch1); // 添加묻다 1
curl_multi_add_handle($mh, $ch2); // 添加묻다 2
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active && $mrc == CURLM_OK);
curl_multi_remove_handle($mh, $ch1); // 移除묻다 1
curl_multi_remove_handle($mh, $ch2); // 移除묻다 2
curl_multi_close($mh); // 폐쇄 multi curl 핸들
여러 요청이 동시에 실행되면 일반적으로 모든 요청이 완료된 후에는 세부 정보를 얻을 수 있기를 원합니다. Curl_GetInfo 함수는 반환 된 상태 코드 ( Curlinfo_http_code ) 및 기타 메타 데이터와 같은 각 CURL 요청에 대한 실행 정보를 얻는 데 사용됩니다. 그러나 여러 요청이 비동기 적으로 및 병렬로 이루어 지므로 Curl_GetInfo는 요청이 완전히 실행되기 전에 데이터를 검색하지 않도록 적절한 시간에 호출해야합니다.
요청이 완료되기 전에 curl_getInfo에 전화하면 잘못되거나 불완전한 데이터가 발생할 수 있습니다. 따라서 합리적인 동기화 타이밍이 매우 중요합니다.
Curl_Multi_Exec을 호출하여 여러 요청을 수행하면 모든 요청이 실행될 때까지 PHP가 루프에 들어갑니다. 이 과정에서 Curl_multi_Select는 이벤트 대기를 처리하는 데 도움이 될 수있어 요청 결과를 얻을 때 더 나은 제어를 할 수 있습니다.
do {
// 等待묻다完成
$mrc = curl_multi_exec($mh, $active);
// 데이터가 준비 될 때까지 기다리십시오
if ($active) {
curl_multi_select($mh);
}
} while ($active && $mrc == CURLM_OK);
모든 요청이 완료되고 모든 핸들이 제거되면 요청 정보를 얻는 것이 적절한시기입니다. 그렇지 않으면 핸들을 미리 닫으면 일부 요청의 결과를 놓칠 수 있습니다.
// 获取묻다信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// 출력 정보
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
데이터를 얻은 후 Curl_multi 세션에서 각 핸들을 제거하고 끝에 닫아야합니다. 이를 통해 폐쇄 요청의 결과를 얻으려고 더 이상 시도하지 않도록합니다.
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
위에서 언급 한 것과 결합하여 각 요청의 세부 사항을 올바르게 얻고 데이터 동기화 문제가 없는지 확인하는보다 완전한 예가 있습니다.
$mh = curl_multi_init(); // 초기화 multi curl 핸들
$ch1 = curl_init("http://gitbox.net/api/data1"); // 묻다 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // 묻다 2
curl_multi_add_handle($mh, $ch1); // 添加묻다 1
curl_multi_add_handle($mh, $ch2); // 添加묻다 2
// 执行묻다并等待完成
do {
$mrc = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // 데이터가 준비 될 때까지 기다리십시오
}
} while ($active && $mrc == CURLM_OK);
// 获取묻다的执行信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// 输出묻다信息
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
// 移除핸들
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 폐쇄 multi curl 핸들
curl_multi_close($mh);
curl_multi_exec 및 curl_multi_select를 올바르게 사용하고 요청이 완료된 후 Curl_GetInfo를 통해 정보를 얻는지 확인하면 비동기 요청으로 인한 데이터 동기화 문제를 효과적으로 피할 수 있습니다. 동시 요청 처리의 경우 타이밍이 중요합니다. 합리적인 통화 주문 및 동기화 전략은 올바른 데이터를 얻을 수 있습니다.