동시 요청에 PHP의 Curl_Multi_* 시리즈 기능을 사용하는 경우, 부적절하게 처리되면 Curl_Multi_Close () 호출 전에 유효하지 않거나 잘못된 요청을 보내기 쉽고 낭비되는 리소스 및 서버 오류가 발생합니다. 다중 핸들을 닫기 전에 모든 요청이 유효하고 올바른지 확인하려면 다음 측면에서 시작하여 최적화 할 수 있습니다.
URL이 올바르게 형식화되도록 Curl_Multi_ADD_HANDLE 에 추가되기 전에 각 개별 CURL 요청 ( CURL_INIT 로 초기화 한 핸들)을 완전히 점검해야합니다. 예를 들어 URL이 올바르게 형식화되고 필요한 요청 헤더가 손상되지 않으며 타임 아웃 매개 변수가 합리적입니다.
샘플 코드 :
function createCurlHandle(string $url): ?\CurlHandle
{
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return null;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 시간 초과 설정
return $ch;
}
멀티 스레드 실행 중에 실행 상태를 통과하여 연결을 맹목적으로 닫지 않고 모든 핸들이 올바르게 응답 할 수 있도록해야합니다.
예:
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3"
];
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = createCurlHandle($url);
if ($ch !== null) {
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
}
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > CURLM_OK) {
// 기록 오류,또는 필요에 따라 방해합니다
break;
}
// 허용하다CPU휴식을 취하십시오
curl_multi_select($multiHandle);
} while ($running > 0);
공식적으로 curl_multi_close ()를 호출하기 전에 모든 개별 핸들을 가로 지르고 리턴 코드 ( Curlinfo_http_code ) 및 기타 정보를 확인하고 다시 시도 해야하는지 또는 실패했는지 여부를 결정해야합니다.
foreach ($curlHandles as $ch) {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
// 예외를 처리하십시오,예를 들어 로깅、다시 제출 요청 등
echo "요청이 실패했습니다,HTTP상태 코드:" . $httpCode . PHP_EOL;
}
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
curl_multi_close($multiHandle);
다중 요청 동시성이 수행되는 시나리오에서는 각 요청 수명주기를 올바르게 관리하는 것이 매우 중요합니다. 초기화 단계에서 시작하는 매개 변수를 엄격하게 검증하고 실행 중 상태를 모니터링하고 끝 이전에 반환 값을 철저히 확인하면이 일련의 단계는 잘못된 요청으로 인한 리소스 폐기물 및 서버 측 압력을 최소화 할 수 있습니다. 예외 처리 메커니즘과 함께 Curl_Multi_Select () 를 합리적으로 사용하면 CURL_MULTI 호출은 효율적이고 안정적 일 수있어 전체 시스템의 신뢰성을 향상시킬 수 있습니다.