PHP의 여러 요청에 CURL을 사용하는 경우 Curl_multi_* 일련의 함수는 특히 동시 요청 시나리오에서 프로그램의 성능을 크게 향상시킬 수 있습니다. 그러나 많은 개발자들은 이러한 기능, 특히 CURL_MULTI_CLOSE 사용을 사용할 때 주요 오류 처리 및 리소스 릴리스 문제를 무시하는 경향이 있습니다. curl_multi_close를 잘못 호출하면 자원 누출, 성능 문제 및 메모리 오버플로 문제가 발생할 수 있습니다.
이 기사에서는 자원 누출 및 기타 잠재적 문제를 피하기 위해 오류를 처리 할 때 Curl_Multi_Close 기능을 올바르게 사용하는 방법을 자세히 설명합니다.
curl_multi_close 함수는 PHP CURL 확장 기능의 함수로, 다중 컬 세션에서 초기화 된 모든 핸들을 닫습니다. Curl_multi_* 함수는 여러 컬 요청을 병렬로 실행할 수있게하는 반면, Curl_Multi_Close는 자원을 확정하기 위해 모든 요청이 완료된 후 각 컬 세션을 올바르게 닫는 데 사용됩니다.
여러 동시 요청을 실행할 때 Curl_multi_init을 사용하여 멀티 세션 리소스를 초기화 한 다음 Curl_multi_add_handle을 사용하여 각 개별 컬 세션을이 멀티 세션에 추가해야합니다. 요청이 완료되면 Curl_multi_Close가 호출되어 다중 세션 리소스를 닫아야합니다.
Code example:
// 얼마나 많은 초기화cURL세션
$mh = curl_multi_init();
$ch1 = curl_init();
$ch2 = curl_init();
// 설정cURL옵션
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch2, CURLOPT_URL, "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);
// 리턴 데이터를 얻고 처리합니다
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 폐쇄cURL세션
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 最后폐쇄多重cURL세션
curl_multi_close($mh);
오류 처리는 여러 요청의 중요한 부분입니다. 여러 요청을 실행할 때 연결 시간 초과, 유효하지 않은 응답, 서버 오류 등을 포함한 다양한 오류가 발생할 수 있습니다. 오류가 발생할 때 릴리스되지 않으면 리소스가 해제되지 않도록하려면 요청이 성공 여부에 관계없이 리소스가 올바르게 닫히도록 예외를 수행 할 수 있습니다.
오류 처리 코드 예 :
try {
// 얼마나 많은 초기화cURL세션
$mh = curl_multi_init();
$ch1 = curl_init();
$ch2 = curl_init();
// 설정cURL옵션
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch2, CURLOPT_URL, "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);
// 각 요청의 결과를 확인하십시오
if ($status != CURLM_OK) {
throw new Exception("cURL요청이 실패했습니다,오류 코드:" . $status);
}
// 리턴 데이터를 얻고 처리합니다
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 여기에서 반환 된 데이터를 처리하십시오...
} catch (Exception $e) {
// 오류 처리 부분:로그 오류 로그
error_log("요청이 실패했습니다:" . $e->getMessage());
} finally {
// 오류가 있는지 확인하십시오,리소스가 올바르게 릴리스됩니다
if (isset($mh)) {
// 폐쇄세션资源
if (isset($ch1)) {
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
}
if (isset($ch2)) {
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
}
curl_multi_close($mh);
}
}
요청이 완료된 후 Curl_Multi_Close가 호출되지 않으면 PHP 세션은 시스템 리소스를 점유하여 메모리 누출 및 성능 문제가 발생합니다. 여러 요청의 경우, undered 컬 핸들이 시간이 지남에 따라 축적되어 프로그램의 안정성에 영향을 미치며 심지어 프로세스가 충돌 할 수 있습니다. 따라서 curl_multi_close를 올바르게 사용하는 것이 중요합니다.
자원 누출은 일반적으로 다음 상황에서 발생합니다.
curl_multi_close 함수를 호출하는 것을 잊었습니다.
오류가 발생하면 프로그램이 마침내 블록에 들어가서 리소스를 해제하지 못합니다.
루프 또는 반복 요청에서 새 세션이 반복적으로 생성되지만 이전 세션은 닫히지 않습니다.
이러한 문제를 피하기위한 모범 사례는 오류가 있더라도 모든 세션을 올바르게 닫을 수 있도록 항상 트리 캐치-패치 구조를 사용하는 것입니다.
Curl_multi_Close 의 적절한 사용은 자원 누출 및 기타 성능 문제를 피하기위한 중요한 단계입니다. 동시 요청이 있으면 항상 오류 처리 및 리소스 관리에주의를 기울여야합니다. Try-Catch-Finally 구조를 통해 각 요청 후 올바른 리소스 릴리스를 보장하면 높은 동시성 환경에서 응용 프로그램의 안정성을 보장합니다.
실제 개발에서는 요청 실패 또는 기타 오류의 경우 리소스 종료를 누락하지 않도록 항상 각 컬 세션을 관리해야합니다. 이러한 방식으로 만 우리의 여러 컬 요청이 더 효율적이고 안정적 일 수 있으며, 잠재적 인 메모리 누출과 성능 병목 현상을 피할 수 있습니다.