Curl_multi_* 시리즈 기능은 동시 요청에 PHP의 CURL 확장을 사용할 때 매우 중요한 도구입니다. CURL_MULTI_CLOSE 는 CURL 멀티 핸들을 닫을 책임이 있지만 부적절하게 사용하면 비정상적인 연결 상태로 쉽게 연결할 수 있습니다. 일부 요청이 완료되지 않고 리소스가 올바르게 해제되지 않으며 설명 할 수없는 시간 초 그렇다면 어떻게 이러한 예외를 우아하고 정확하게 피할 수 있습니까? 이 기사는 자세히 설명 할 것입니다.
많은 개발자가 동시 요청을 처리하면 코드가 다음과 같습니다.
<?php
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 시작하고 실행하십시오
do {
$status = curl_multi_exec($mh, $active);
curl_multi_select($mh);
} while ($active && $status == CURLM_OK);
// 직접 닫습니다
curl_multi_close($mh);
이 글쓰기 방법의 문제점은 요청이 완전히 처리되지 않더라도 (특히 네트워크 조건이 열악한 경우) Curl_multi_Close가 직접 호출되어 일부 연결이 대략 종료되며 결과적으로 상태 이상이 자연스럽게 발생한다는 것입니다.
curl_multi_close를 호출하기 전에 모든 핸들 ( CURL 핸들 )이 처리되어 제거되었는지 확인해야합니다! 올바른 과정은 다음과 같습니다.
curl_multi_exec은 모든 요청이 완료 될 때까지 반복적으로 호출됩니다.
각 개별 컬 핸들 ( curl_multi_remove_handle )을 제거합니다.
단일 컬 핸들 ( Curl_Close )을 별도로 닫습니다.
마지막으로 멀티 핸들 ( curl_multi_close )을 닫습니다.
수정 된 코드 예제는 다음과 같습니다.
<?php
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 시작하고 실행하십시오
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
// 싱글을 제거하고 닫으십시오 handle
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
// 마지막으로 multi handle
curl_multi_close($mh);
curl_multi_close 전에 curl_multi_remove_handle을 수행 해야합니다 .
연결이 요청하지 않더라도 remove_handle + Close를 통해 올바르게 정리해야합니다.
루프에서 curl_multi_select를 사용하면 CPU 사용량을 줄이고 바쁜 대기를 피할 수 있습니다.
Curl_errno 및 Curl_error 와 같은 오류를 포착하고 성공 요청을 맹목적으로 신뢰하지 마십시오.
높은 동시성 시나리오에서 세부 사항은 성공 또는 실패를 결정합니다. curl_multi_close 의 본질은 멀티 핸들을 파괴하는 것입니다. 그 자체는 모든 단일 연결의 안전한 닫기를 보장하지는 않습니다. 따라서 멀티 핸들을 닫기 전에 각 개별 핸들을 수동으로 제거하고 닫으십시오 . 이는 연결 상태 예외를 피하는 열쇠입니다.
올바른 처리 프로세스에 따라 두통이 발생하기 쉬운 숨겨진 버그에서 동시 요청이 안정적이고 효율적으로 실행될 수 있습니다.