curl_multi_* 일련의 함수를 사용하여 동시 요청을 할 때는 일반적으로 여러 개의 컬 핸들을 열고 통합 관리를 위해 Curl_multi 핸들에 추가합니다.
Resources를 해제하기 위해 Curl_Multi_Close를 호출하기 전에 모든 요청이 올바르게 완료되도록하려면 각 요청의 실행 상태를 합리적으로 감지해야합니다. 이 기사는이 요구 사항을 달성하는 표준적이고 신뢰할 수있는 방법을 설명합니다.
일반적으로 여러 요청을 처리하기 위해 다음 단계를 수행합니다.
여러 컬 별도 핸들을 초기화하십시오.
이 핸들을 curl_multi 핸들에 추가하십시오.
curl_multi_exec을 사용하여 요청을 지속적으로 실행하십시오.
curl_multi_select를 사용하여 curl_multi_exec 과 협력하여 요청이 완료되었는지 여부를 감지하십시오.
완료된 요청 처리를 하나씩 제거합니다.
모든 요청이 완료되었는지 확인한 다음 Curl_Multi_Close를 호출하십시오.
다음은 여러 URL을 요청해야한다고 가정 할 수 있습니다 (여기서 https://gitbox.net/example1 및 https://gitbox.net/example2를 예제로 사용합니다).
<?php
// 초기화 cURL multi 핸들
$multiHandle = curl_multi_init();
// 각각 저장하십시오 cURL 핸들的数组
$curlHandles = [];
// 요청합니다 URL 목록
$urls = [
'https://gitbox.net/example1',
'https://gitbox.net/example2',
];
// 각각을 만들고 추가하십시오 cURL 핸들
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 구현하다 multi 묻다
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
// 예방하다 CPU 게으른
if ($status == CURLM_OK) {
curl_multi_select($multiHandle);
} else {
break;
}
// 检查是否有已完成的묻다
while ($info = curl_multi_info_read($multiHandle)) {
if ($info['msg'] == CURLMSG_DONE) {
// 获取完成的핸들
$completedHandle = $info['handle'];
// 반환 된 콘텐츠를 얻으십시오
$response = curl_multi_getcontent($completedHandle);
// 반환 된 데이터는 여기에서 처리 할 수 있습니다
echo "묻다完成,반환 데이터 길이:" . strlen($response) . PHP_EOL;
// 移除并关闭已完成的핸들
curl_multi_remove_handle($multiHandle, $completedHandle);
curl_close($completedHandle);
}
}
} while ($running > 0);
// 마지막으로 multi 핸들
curl_multi_close($multiHandle);
curl_multi_exec : 동시 요청의 실행을 촉진하고 여전히 실행중인 연결 수를 반환합니다.
curl_multi_select : CPU 자원 낭비를 줄이기 위해 활성 연결을 차단하고 기다리는 데 사용됩니다.
curl_multi_info_read : 요청이 완료되었는지 여부와 완성 된 핸들을 한 번에 처리 할 수 있는지 감지합니다.
curl_multi_close 는 $ running == 0 이고 모든 클론 핸들이 제거되고 닫힌 경우에만 호출됩니다.
많은 요청이있는 경우 일부 요청이 오랫동안 고정되는 것을 방지하기 위해 타임 아웃 메커니즘을 추가하는 것이 좋습니다.
curl_multi_select가 때때로 -1을 반환합니다.이 경우 죽은 루프를 방지하기 위해 작은 대기에 usleep ()를 사용해야합니다.
if (curl_multi_select($multiHandle) == -1) {
usleep(100);
}
이를 통해 스크립트가 더 강력 해집니다.
CURL_MULTI_CLOSE를 사용하기 전에 키는 모든 하위 수단이 완료되고 올바르게 정리되었음을 확인하는 것입니다. 위의 패턴은 일반적이고 권장되는 표준 연습입니다.
curl_multi_* 시리즈의 동작을 이해하면보다 효율적이고 안정적인 동시 네트워크 요청 코드를 작성하는 데 도움이됩니다!