PHP의 네트워크 요청에 CURL을 사용하는 것은 특히 외부 API와 통신해야 할 때 매우 일반적인 관행입니다. 그러나 사용한 컬 핸들을 올바르게 닫지 않으면 메모리 누출이나 자원 낭비가 발생할 수 있습니다. 이 기사에서는 Curl_Close 기능을 올바르게 사용하여 모든 열린 핸들, 특히 동시 요청 또는 루프 작업을 수행 할 때 올바르게 닫히도록하는 방법을 자세히 설명합니다.
가장 기본적인 사용 시나리오에서 컬 핸들을 닫는 것은 비교적 간단합니다.
$ch = curl_init('https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
이 코드는 요청이 완료된 직후 Curl_Close를 사용하여 핸들을 닫습니다.
여러 요청을 보내야하는 경우 일반적으로 루프를 사용하며 닫는 핸들을 쉽게 놓칠 수 있습니다.
$urls = [
'https://gitbox.net/api/user/1',
'https://gitbox.net/api/user/2',
'https://gitbox.net/api/user/3',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 잊어 버린 경우 curl_close($ch),각 반복은 릴리스되지 않은 리소스를 남깁니다
}
이 경우 각 반복 후에 핸들은 수동으로 닫아야합니다.
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // 손잡이를 닫으십시오
}
curl_multi_init을 사용하여 동시 요청을 구현하는 경우, 마감 핸들의 순서는 다음에주의를 기울여야합니다.
$multiHandle = curl_multi_init();
$curlHandles = [];
$urls = [
'https://gitbox.net/api/task/1',
'https://gitbox.net/api/task/2',
'https://gitbox.net/api/task/3',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 동시 요청을 수행하십시오
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
// 모든 핸들을 제거하고 닫습니다
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch); // 종료하는 주요 단계는 다음과 같습니다
}
curl_multi_close($multiHandle);
여기에서 curl_close ($ ch) 외에도 먼저 curl_multi_remove_handle을 호출하여 핸들을 안전하게 닫으려면 제거해야합니다.
핸들을 닫는 것을 수동으로 잊어 버리지 않으려면 기능의 끝에서 리소스가 닫히도록 함수의 요청 프로세스를 캡슐화 할 수 있습니다.
function fetchUrl($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // 기능 내부에서 리소스가 닫혀 있는지 확인하십시오
return $response;
}
$data = fetchUrl('https://gitbox.net/api/config');
요청이 실패하더라도 항상 curl_close ()를 호출하여 핸들을 닫으십시오 .
다중 핸들 동시성을 사용할 때는 curl_close를 놓치지 마십시오.
curl_multi_*를 사용하는 경우 Curl_multi_Remove_handle을 먼저 사용한 다음 Curl_Close를 사용하십시오.
청소 작업이 내부적으로 수행되고 누락의 위험을 줄이기 위해 요청 로직을 기능으로 가능한 한 캡슐화하십시오.
리소스를 올바르게 공개하면 스크립트의 효율성과 견고성을 향상시킬 수있을뿐만 아니라 서버의 리소스 누출 위험을 피할 수 있습니다. 다중 스레드 또는 대규모 요청이 요청되는 시나리오에서 특히 중요합니다. 좋은 코딩 습관과 구조 설계를 사용하면 모든 컬 핸들이 올바르게 닫히도록 쉽습니다.