CURL은 여러 비동기 HTTP 요청을 할 때 PHP에서 매우 강력한 도구입니다. Curl_multi_* 함수를 사용하여 개발자는 효율성을 향상시키기 위해 여러 요청을 동시에 시작할 수 있습니다. curl_multi_close 함수는 여러 컬 세션을 닫는 데 사용되지만 비동기 요청을 할 때 어떻게 응답 순서를 보장합니까? curl_multi_exec이 여러 요청에 대한 응답을 반환 할 수 있고, 이러한 응답이 완료 될 수있는 순서는 요청 된 순서와 다를 수 있기 때문입니다.
이 기사에서는 Curl_multi_Close를 사용할 때 비동기 요청의 결과가 요청 순서를 유지하는 방법을 자세히 설명합니다.
curl_multi_* 일련의 함수는 동시 요청을 통해 성능을 향상시키는 방법을 제공합니다. 일반적으로 사용되는 여러 기능에는 다음이 포함됩니다.
curl_multi_init () : 컬 핸들을 초기화하고 컬 리소스 풀을 만듭니다.
curl_multi_add_handle () : Curl 핸들을 여러 Curl Request Pool에 추가합니다.
curl_multi_exec () : 여러 컬 요청을 실행합니다.
curl_multi_getContent () : 각 요청의 응답 내용을 가져옵니다.
curl_multi_close () : CURL 요청 풀을 닫고 리소스를 해제하십시오.
이러한 기능은 종종 비동기 요청을 수행하는 데 함께 사용되므로 성능이 향상됩니다. 그러나 응답 완료 순서는 요청 순서와 다를 수 있으므로 응답 결과 순서가 중요한 문제가되도록하는 방법.
비동기 요청을 할 때 Curl_multi_exec은 백그라운드에서 동시에 여러 요청을 시작하고 모든 요청이 완료되기를 기다립니다. 그러나 이러한 요청의 완료 시간은 예측할 수 없으므로 응답 순서가 중단 될 수 있습니다.
결과가 순서대로 처리되도록하려면 요청과 응답 사이의 매핑 관계를 기록하기 위해 일부 메커니즘을 사용해야합니다. 일반적인 관행은 연관 어레이를 사용하는 것입니다. 구체적으로, 개발자는 각 요청에 대한 고유 식별자를 설정하고 응답을 수신 할 때이 식별자에 따라 결과를 올바르게 정렬 할 수 있습니다.
구현 예는 다음과 같습니다.
<?php
// 요청합니다URL목록
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3'
];
// 초기화 cURL multi 핸들
$mh = curl_multi_init();
// 묻다핸들数组
$curl_handles = [];
$responses = [];
$index = 0;
// 각 요청에 대해 작성하십시오 cURL 핸들并添加到 multi 핸들中
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 각 요청의 색인을 기록하십시오,응답이 순서대로 처리됩니다
curl_multi_add_handle($mh, $ch);
// 将핸들与索引关联
$curl_handles[(string)$ch] = $index++;
}
// 모든 것을 수행하십시오 cURL 묻다
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh); // 프로그램이 데이터가 돌아올 때까지 기다리게하십시오
} while ($running > 0);
// 读取每个묻다的响应,并按묻다的顺序保存结果
foreach ($curl_handles as $ch => $index) {
$response = curl_multi_getcontent($ch);
$responses[$index] = $response; // 인덱스별로 응답을 저장하십시오
curl_multi_remove_handle($mh, $ch); // 移除핸들
curl_close($ch); // 关闭每个핸들
}
// 마지막으로 multi 핸들
curl_multi_close($mh);
// 출력 응답 결과,确保按照묻다顺序输出
foreach ($responses as $response) {
echo $response . PHP_EOL;
}
?>
위의 코드에서 먼저 컬 멀티 핸들을 초기화하고 각 URL에 대한 컬 핸들을 만듭니다. 응답이 순서대로 반환되도록하기 위해 각 컬 핸들을 요청 목록에서 인덱스와 연결하는 연관 배열 $ curl_handles를 사용합니다.
모든 요청이 완료되면이 연관 배열을 반복하고 각 응답을 인덱스에 따라 $ zeses 배열에 저장하여 응답 순서를 보장합니다.
Curl_Multi_Exec을 사용하여 모든 요청이 실행되면 실행중인 매개 변수는 여전히 실행중인 요청 수를 표시하는 데 사용됩니다. Curl_multi_Select는 요청이 완료 될 때까지 데이터가 반환되지 않으면 프로그램이 차단되며 CPU 리소스를 낭비하지 않도록합니다.
마지막으로, 우리는 curl_multi_remove_handle 및 curl_close를 사용하여 모든 컬 핸들을 닫고 curl_multi_close를 사용하여 여러 컬 핸들을 닫아 관련 리소스를 확보합니다.
연관 배열을 합리적으로 사용하면 비동기 요청을 수행 할 때 응답 결과가 요청 순서대로 반환 될 수 있습니다. PHP의 비동기 요청에 대해 curl_multi_* 일련의 함수를 사용하는 경우, 특히 여러 인터페이스에서 응답을 처리 할 때 순서를 유지하는 것이 중요합니다. 이 예를 통해 PHP에서 비동기 요청을하고 주문을 보장하여 프로그램 성능 및 안정성을 향상시키는 방법을 더 잘 이해할 수 있습니다.