현재 위치: > 최신 기사 목록> Curl_Close를 호출 한 후 PHP 스크립트 실행의 지연을 피하는 방법?

Curl_Close를 호출 한 후 PHP 스크립트 실행의 지연을 피하는 방법?

gitbox 2025-05-26

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는 백그라운드에서 나머지 데이터를 정리하려고 시도하여 실행 시간이 더욱 증가 할 수 있습니다.

해결책

1. 연결을 명시 적으로 닫습니다

연결 재사용으로 인한 지연을 피하기 위해 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 차단 문제를 효과적으로 피할 수 있습니다.

2. 컬 대신 fsocopen을 사용하십시오 (간단한 요청 요청)

간단한 GET 요청을 만들고 성능에 대해 매우 우려하는 경우 FSOCCKOPEN을 사용하여 요청을 수동으로 구성하여 CURL의 리소스 관리 로직을 완전히 우회하십시오.

3. CURL을 비동기로 릴리스합니다 (특정 프레임 워크/환경에만 해당)

Swoole 및 ReactPHP와 같은 비동기 프레임 워크를 사용하는 경우 CURL을 비동기 작업으로 캡슐화하고 백그라운드에서 릴리스 작업을 수행하여 기본 스레드 차단을 피할 수 있습니다.

4. 컬 핸들 재사용 (고급)

많은 수의 요청을 위해 Curl_multi_* 인터페이스를 사용하여 연결을 균일하게 관리하고 핸들의 빈번한 생성 및 파괴를 피하여 CURL_CLOSE 의 오버 헤드를 줄일 수 있습니다. 그러나 이것은 고급 사용법이며 SDK 또는 기초 라이브러리를 구축하는 데 적합합니다.

요약

Curl_Close는 핸들을 닫는 작업 일뿐 아니라 일부 시나리오에서 성능 병목 현상이 될 수 있습니다. CURL 옵션을 합리적으로 설정하거나 실제 요구에 따라 다른 네트워크 요청 방법을 선택하면 CURL_CLOSE 로 인한 불필요한 지연을 효과적으로 피할 수 있습니다. 성능에 민감한 PHP 프로젝트에서 이러한 세부 사항에 중점을두면 종종 더 부드러운 사용자 경험과 시스템 처리량이 높아집니다.