PHP 네트워크 요청에서 CURL은 가장 일반적으로 사용되는 도구 중 하나입니다. 특히 동시 HTTP 요청을 처리 할 때 CURL 관련 기능의 합리적인 사용은 시스템의 안정성 및 자원 활용과 직접 관련이 있습니다. 이 기사는 CURL_CLOSE () 기능에 중점을 두어 고 동시성 시나리오에서 올바른 사용과 잘못된 사용으로 인해 발생할 수있는 자원 폐기물 문제를 논의합니다.
CURL은 PHP가 제공하는 강력한 네트워크 요청 라이브러리이며 HTTP/HTTPS 요청을 시작하는 데 사용할 수 있습니다. 사용 프로세스는 대략 다음과 같습니다.
초기화 : curl_init ()
매개 변수 설정 : curl_setopt ()
요청 요청 : curl_exec ()
자원을 닫습니다 : curl_close ()
일반적으로 개발자는 각각의 요청 후 자원을 해제하기위한 Curl_Close () 에 전화합니다. 이 습관은 일생성이 낮거나 일생 단기 스크립트에서 큰 문제가되지 않지만 일회성이 높거나 긴 연결된 서비스에서 성능 트랩이 숨겨 질 수 있습니다.
PHP가 CURL을 사용하고 CURL_SHARE 또는 CURLOPT_FORBID_REUSE 와 같은 매개 변수를 활성화하면 기본 Libcurl 라이브러리는 기존 연결 (즉, 연결 풀)을 재사용하려고합니다. 연결 멀티플렉싱은 TCP 연결 구축 및 TLS 핸드 셰이크와 같은 오버 헤드를 크게 줄이고 요청 효율성을 향상시킬 수 있습니다.
그러나 문제는 curl_close ()가 호출 될 때마다 현재 핸들에 해당하는 연결 정보가 파괴된다는 것입니다. 기본 연결이 재사용 값을 소진하지 않더라도 연결이 끊어져 연결 풀이 유효하지 않고 자원 낭비가됩니다.
function fetchData($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // 매번 연결을 파괴하십시오
return $response;
}
$data = fetchData("https://gitbox.net/api/data");
동시 동시성 에서이 패턴은 매번 새로운 연결을 설정하여 서버 측에 큰 압력을 가하고 로컬 리소스 소비를 증가시킵니다.
배치 요청에서 컬 핸들을 재사용하고 URL 만 업데이트하고 요청 매개 변수 만 업데이트 할 수 있습니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$urls = [
"https://gitbox.net/api/user",
"https://gitbox.net/api/data",
"https://gitbox.net/api/config"
];
foreach ($urls as $url) {
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
// 거래하십시오 $response
}
curl_close($ch); // 마지막으로 통합 폐쇄
이 접근법은 연결 설정 및 폐쇄 빈도를 크게 줄이고 동일한 수명주기에서 여러 유사한 요청에 적합합니다.
동시 요청의 경우 Curl_multi_init ()를 사용하여 여러 핸들을 관리 한 다음 실행 후 균일하게 닫는 것이 좋습니다.
$multi = curl_multi_init();
$chs = [];
$urls = [
"https://gitbox.net/api/user",
"https://gitbox.net/api/data",
"https://gitbox.net/api/config"
];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multi, $ch);
$chs[$i] = $ch;
}
$running = null;
do {
curl_multi_exec($multi, $running);
curl_multi_select($multi);
} while ($running > 0);
foreach ($chs as $ch) {
$content = curl_multi_getcontent($ch);
// 거래하십시오 $content
curl_multi_remove_handle($multi, $ch);
curl_close($ch);
}
curl_multi_close($multi);
이 방법은 연결 풀의 멀티플렉싱 기능을 완전히 활용할 수 있으며 동시 인터페이스 요청 시나리오에서 매우 실용적입니다.
HTTP Keep-Alive 프로토콜을 사용해야합니다.
자주 요청되는 도메인 이름의 경우 DNS 캐시 또는 IP 직접 연결을 고려해야합니다.
죽은 연결을 피하기 위해 Curlopt_Timeout을 합리적으로 사용하십시오.
PHP-FPM 환경에서 요청 당 모든 CURL 구성을 재구성하는 것을 피하고 일반적인 로직 캡슐화를 다중화합니다.
고 동시성 PHP 응용 프로그램에서 Curl_Close () 는 "근접"도구가 아닙니다. 근본적인 행동과 연결 재사용 메커니즘을 이해하면 개발자가보다 효율적이고 안정적인 네트워크 커뮤니케이션 논리를 작성하는 데 도움이됩니다. 다중화 핸들 또는 Curl_multi를 사용하면 리소스를 절약 할뿐만 아니라 요청 성능을 크게 향상시킬 수 있습니다.
합리적으로 연결 수명주기를 관리하는 것은 시스템 처리량을 향상시키는 핵심 단계입니다. 이 기사가 실제 프로젝트에서 최적화하도록 영감을주기를 바랍니다.