많은 동시 HTTP 요청을 처리 할 때 Curl_multi 시리즈 기능은 PHP에서 매우 실용적인 도구입니다. 그중에서도 Curl_multi_Close는 최종 단계에서 필수적인 단계이며 Curl_multi_init 에 의해 생성 된 리소스를 올바르게 해제하는 데 사용됩니다. 이 기사는 Curl_Multi_Close 의 올바른 사용법을 설명하고 일반적인 자원 누출 문제를 피하는 데 도움이되는 실용적인 예를 제공합니다.
CURL_MULTI_INIT를 사용하여 CURL 멀티 핸들이 생성 될 때마다 PHP는 멀티 핸들 및 포함 된 다양한 요청을 관리하기 위해 메모리 조각을 할당합니다. Curl_Close 로 단일 클론 핸들 ( Curl_Init 에 의해 생성)이 닫혀 있어도 전체 멀티 핸들은 여전히 시스템 리소스를 점유합니다.
curl_multi_close를 사용하는 것을 잊어 버린 경우, 높은 동시성 시나리오에서 메모리 누출 및 프로그램 충돌을 쉽게 유발할 수 있습니다.
따라서 모든 동시 요청이 완료된 후에는 Resource를 완전히 자유롭게하려면 Curl_Multi_Close가 호출되어야합니다 .
curl_multi 시리즈 기능을 사용하는 일반적인 프로세스는 다음과 같습니다.
멀티 핸들 생성 ( curl_multi_init )
여러 개의 별도 컬 핸들을 생성하고 구성합니다 ( curl_init )
멀티 핸들에 각 컬 핸들을 추가하십시오 ( curl_multi_add_handle ).
모든 요청을 실행하고 모니터링합니다 ( curl_multi_exec 및 curl_multi_select )
단일 핸들 ( curl_multi_remove_handle )을 제거하고 닫으십시오 ( curl_close )
마지막으로 멀티 핸들 ( curl_multi_close )을 닫습니다.
다음은 여러 URL을 동시에 요청하고 모든 관련 리소스를 올바르게 정리하는 방법을 보여주는 완전한 예입니다.
<?php
// 동시 요청을 보내려면URL목록
$urls = [
"https://gitbox.net/api/endpoint1",
"https://gitbox.net/api/endpoint2",
"https://gitbox.net/api/endpoint3",
];
// 초기화 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 초기화每个单独的 curl handle 그리고 가입 multi handle
foreach ($urls as $key => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$key] = $ch;
}
// 요청을 실행하십시오
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > CURLM_OK) {
// 오류 처리
echo "cURL error: " . curl_multi_strerror($status);
break;
}
// 활성 연결을 기다리고 있습니다
curl_multi_select($multiHandle);
} while ($running > 0);
// 응답 결과를 수집하십시오
$responses = [];
foreach ($curlHandles as $key => $ch) {
$responses[$key] = curl_multi_getcontent($ch);
// 각 어린이를 제거하고 닫으십시오 handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 마지막으로 multi handle
curl_multi_close($multiHandle);
// 출력 응답
foreach ($responses as $index => $response) {
echo "Response from URL {$urls[$index]}:" . PHP_EOL;
echo $response . PHP_EOL . PHP_EOL;
}
?>
개별 컬 핸들을 먼저 제거한 다음 닫은 다음 마침내 멀티 핸들을 닫으십시오.
멀티 핸들을 직접 닫지 말고 예측할 수없는 오류가 발생하므로 하위 손잡이를 작동하지 마십시오 .
동시성 환경에서는 장기 차단을 방지하기 위해 시간 초과 제어 ( Curlopt_timeout )를 추가하는 것이 좋습니다.
curl_multi_close는 합리적인 리소스의 릴리스를 보장하는 마지막 단계입니다. 특히 다중 공유 시나리오에서는 좋은 마감 습관을 개발하는 것이 매우 중요합니다. 각 조항 핸들을 올바르게 정리하고 마지막으로 멀티 핸들을 닫으면 자원 누출을 효과적으로 방지하고 PHP 응용 프로그램의 안정성과 성능을 향상시킬 수 있습니다.