CURL은 네트워크 요청에 PHP를 사용할 때 가장 일반적인 도구 중 하나입니다. 많은 개발자들이 요청을 완료 한 후 표준 프로세스에 따라 리소스를 닫습니다 . 그러나 동시성이 높은 또는 고성능 요구 사항이있는 일부 시나리오에서는 비밀 문제가 발생합니다. Curl_Close를 호출 한 후 PHP 스크립트 실행에 불합리한 지연이 있습니다.
이 지연은 일반적으로 긴 연결 (유지) 또는 특정 서버 구성의 맥락에서 발생합니다. 요청이 완료된 것으로 보이지만 Curl_Close는 실제로 기본 연결의 릴리스 프로세스를 기다릴 수 있으므로 스크립트의 지속적인 실행을 차단할 수 있습니다.
간단한 예를 살펴 보겠습니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.gitbox.net/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo "완료를 요청하십시오";
대부분의 경우이 코드는 빠르게 실행될 수 있습니다. 그러나 일부 서버 환경 (특히 대상 서버가 HTTP/2 또는 연결 멀티플렉싱을 지원할 때)에서 CURL_CLOSE는 수백 밀리 초 이상으로 차단할 수 있습니다.
CURL_CLOSE는 단순히 자유 메모리가 아니며, 특히 HTTP Keep-Alive가 활성화 될 때 기본 TCP 연결이 닫히거나 자유롭게 자원이 발생할 때까지 기다릴 수 있습니다. 이 동작은 최신 버전의 Libcurl 라이브러리를 사용할 때 또는 특정 서버 (예 : Nginx + Keep-Alive)와 통신 할 때 더 분명합니다.
또한 Curl_Exec이 데이터를 크게 반환하거나 연결을 완전히 읽지 않으면 Curl_Close는 백그라운드에서 나머지 데이터를 정리하려고 시도하여 실행 시간이 더욱 증가 할 수 있습니다.
연결 재사용으로 인한 지연을 피하기 위해 Curlopt_forbid_Reuse를 설정하여 연결을 닫을 수 있습니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.gitbox.net/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true); // 연결 재사용을 비활성화합니다
$response = curl_exec($ch);
curl_close($ch);
이 방법은 일부 성능을 희생하지만 (모든 요청에 대한 새로운 연결이 생성되기 때문에) Curl_Close 차단 문제를 효과적으로 피할 수 있습니다.
간단한 GET 요청을 만들고 성능에 대해 매우 우려하는 경우 FSOCCKOPEN을 사용하여 요청을 수동으로 구성하여 CURL의 리소스 관리 로직을 완전히 우회하십시오.
Swoole 및 ReactPHP와 같은 비동기 프레임 워크를 사용하는 경우 CURL을 비동기 작업으로 캡슐화하고 백그라운드에서 릴리스 작업을 수행하여 기본 스레드 차단을 피할 수 있습니다.
많은 수의 요청을 위해 Curl_multi_* 인터페이스를 사용하여 연결을 균일하게 관리하고 핸들의 빈번한 생성 및 파괴를 피하여 CURL_CLOSE 의 오버 헤드를 줄일 수 있습니다. 그러나 이것은 고급 사용법이며 SDK 또는 기초 라이브러리를 구축하는 데 적합합니다.
Curl_Close는 핸들을 닫는 작업 일뿐 아니라 일부 시나리오에서 성능 병목 현상이 될 수 있습니다. CURL 옵션을 합리적으로 설정하거나 실제 요구에 따라 다른 네트워크 요청 방법을 선택하면 CURL_CLOSE 로 인한 불필요한 지연을 효과적으로 피할 수 있습니다. 성능에 민감한 PHP 프로젝트에서 이러한 세부 사항에 중점을두면 종종 더 부드러운 사용자 경험과 시스템 처리량이 높아집니다.