Curl은 HTTP 요청을 보내는 데 사용되는 도구로, 다른 웹 서비스와 쉽게 상호 작용할 수 있습니다. CURL을 통해 HTTP 요청을 실행하면 요청 된 구성, 실행 상태 및 기타 정보를 저장하기 위해 일부 메모리를 할당합니다. 이러한 리소스가 적시에 해제되지 않으면 메모리 누출로 이어질 수 있습니다.
멀티 스레드 환경 (예 : CURL_MULTI_* 함수 그룹을 통해 동시 요청을 수행)에서 여러 스레드가 여러 CURL 요청을 동시에 실행할 수 있습니다. 이러한 컬 리소스가 올바르게 닫히지 않으면 메모리 누출이 더 심해져 시스템의 성능과 안정성에 영향을 미칩니다.
PHP에서 Curl_multi_* 일련의 함수를 사용하면 여러 CURL 요청을 동시에 처리 할 수 있으므로 프로그램의 효율성이 향상됩니다. 일반적으로 다음 코드는 동시에 여러 요청을 시작하는 데 사용됩니다.
// 다중 생성cURL핸들
$multiCurl = curl_multi_init();
$curlHandles = [];
// 다중 초기화cURL세션
for ($i = 0; $i < 5; $i++) {
$curlHandles[$i] = curl_init();
curl_setopt($curlHandles[$i], CURLOPT_URL, "http://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
// 동시 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($multiCurl, $running);
} while ($running > 0);
// 폐쇄cURL세션
foreach ($curlHandles as $handle) {
curl_multi_remove_handle($multiCurl, $handle);
curl_close($handle); // 正确폐쇄资源
}
// 폐쇄多路复用핸들
curl_multi_close($multiCurl);
위의 코드에서는 curl_multi_init ()를 사용하여 멀티플렉스 핸들을 만들고 curl_multi_add_handle ()을 통해 여러 컬 핸들을 멀티 플렉스에 추가하고 모든 요청을 실행합니다. 각 컬 핸들은 Curl_Close () 를 통해 닫히려면 메모리를 확보합니다.
다중 스레드 환경에서 각 컬 요청에는 메모리 리소스 할당이 포함됩니다. 특히 많은 요청이있을 때 메모리 사용량이 커집니다. 컬 핸들을 닫는 것을 잊어 버리면 PHP 프로세스는 이러한 리소스를 제거 할 수 없으며 결국 메모리 누출로 이어질 것입니다.
위의 예에서, 각 컬 요청이 완료된 후에는 Curl_Close ($ hands) 를 통해 리소스를 명시 적으로 릴리스하여 메모리가 지속적으로 점유되지 않도록하고 잠재적 인 메모리 누출을 피합니다.
다중 스레드 환경에서는 네트워크 요청 실패, CURL 구성 오류 등과 같은 예기치 않은 오류가 발생할 수 있습니다.이 경우 적시에 리소스를 해제하는 것이 특히 중요합니다. 리소스가 릴리스되도록하려면 Try-Catch 문 또는 마지막 명령문을 사용하여 예외가 발생하는지 여부에 관계없이 리소스가 올바르게 릴리스되도록 할 수 있습니다.
try {
// 동시 요청을 시작하십시오
$multiCurl = curl_multi_init();
$curlHandles = [];
for ($i = 0; $i < 5; $i++) {
$curlHandles[$i] = curl_init();
curl_setopt($curlHandles[$i], CURLOPT_URL, "http://gitbox.net/api/data?id=$i");
curl_setopt($curlHandles[$i], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
$running = null;
do {
curl_multi_exec($multiCurl, $running);
} while ($running > 0);
// 处理响应并폐쇄핸들
// 여기서 반환 된 결과를 처리 할 수 있습니다
} catch (Exception $e) {
// 예외를 처리하십시오
echo "Error occurred: " . $e->getMessage();
} finally {
// 리소스가 해제되도록하십시오
foreach ($curlHandles as $handle) {
curl_multi_remove_handle($multiCurl, $handle);
curl_close($handle);
}
curl_multi_close($multiCurl);
}
예외가 발생하는지 여부에 관계없이 컬 핸들이 닫혀 메모리 누출을 피하십시오.
다중 스레드 환경에서는 특히 여러 동시 요청을 처리 할 때 Curl_Close () 기능을 자유 리소스에 올바르게 사용하는 것이 중요합니다. 각 CURL 요청 후 CURL_CLOSE () 가 호출되고 예외가 발생할 때 리소스 릴리스를 보장 할 수있게함으로써 메모리 누출 문제를 효과적으로 피할 수 있으므로 프로그램의 안정성과 성능을 향상시킬 수 있습니다.
실제 개발에서는 특히 많은 동시 요청을 처리 할 때 항상 메모리 관리에주의를 기울여야합니다. 이 기사가 멀티 스레드 환경에서 CURL을 사용하여 자원 관리에 도움이되기를 바랍니다.