현재 위치: > 최신 기사 목록> 객체 캡슐화 Curl_Share를 사용하여 공유 리소스 풀을 구현하십시오

객체 캡슐화 Curl_Share를 사용하여 공유 리소스 풀을 구현하십시오

M66 2025-05-21

PHP에서 동시 HTTP 요청이 높은 경우, 특히 많은 동시 연결이 포함될 때 동시 HTTP 요청을 할 때 자주 초기화 및 컬링 을 해제 할 수 있습니다. 이 문제를 해결하기 위해 Curl_share_init 함수는 DNS 캐시, 쿠키 등과 같은 특정 리소스를 공유하여 다중 스레드 또는 다중 프로세스 환경에서 실행 효율성을 향상시키는 방법을 제공합니다.

이 기사는 Curl_share_init 함수를 사용하는 방법을 소개하고 효율적인 공유 리소스 풀 관리 메커니즘을 구현하기 위해 객체 지향적 인 방식으로 캡슐화합니다.

1. Curl_share_init 함수 소개

curl_share_init () 는 libcurl에서 공유 핸들을 초기화하기 위해 제공하는 함수입니다. 여러 컬 핸들이 다음 리소스를 공유 할 수 있습니다.

  • 쿠키 데이터

  • DNS 캐시

  • SSL 세션 정보

  • 연결 풀

리소스 공유의 핵심은 curl_setopt를 사용하여 각 컬 핸들에 대한 공유 핸들을 설정하는 것입니다.

 curl_setopt($ch, CURLOPT_SHARE, $shareHandle);

공유 핸들 자체는 curl_share_init () 에 의해 생성되며 curl_share_setopt () 를 통해 구성됩니다.

2. 객체 지향 캡슐화 및 공유 관리 클래스

우리는 공유 핸들의 생성, 관리 및 파괴를 캡슐화하는 간단한 공유 리소스 풀 관리 클래스를 설계 할 수 있으며 멀티 스레드 환경에서 재사용을 지원합니다.

 class CurlSharePool
{
    private static $instance = null;
    private $shareHandle;

    private function __construct()
    {
        $this->shareHandle = curl_share_init();
        curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
        curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
        curl_share_setopt($this->shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
    }

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getShareHandle()
    {
        return $this->shareHandle;
    }

    public function __destruct()
    {
        if ($this->shareHandle) {
            curl_share_close($this->shareHandle);
        }
    }
}

3. 예제를 사용하십시오

다음은 공유 리소스 풀을 사용하여 여러 HTTP 요청을 보내는 예입니다.

 $urls = [
    "https://m66.net/api/v1/data1",
    "https://m66.net/api/v1/data2",
    "https://m66.net/api/v1/data3"
];

$share = CurlSharePool::getInstance()->getShareHandle();
$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $share);
    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) {
    $response = curl_multi_getcontent($ch);
    echo $response . PHP_EOL;
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);

4. 우위 분석

공유 핸들을 사용하는 것의 가장 큰 장점은 요청 당 DNS를 다시 제작하고 SSL 연결을 다시 설정하지 않으므로 높은 동시성 시나리오에서 효율성을 크게 향상시킬 수 있다는 것입니다. 캡슐화 클래스를 사용하면 자원 관리를 단순화하고 자원 누출을 피하고 나중에 유지 보수 및 확장에보다 도움이 될 수 있습니다.

V. 결론

Curl_share_init은 PHP에서 일반적이지 않지만 고성능 요구 사항을 가진 시스템에서 저렴한 최적화 방법을 제공합니다. 공유 핸들의 객체 관리 모델을 캡슐화함으로써보다 효율적이고 안정적인 자원 재사용을 달성하여 전체 시스템의 응답 속도 및 동시 기능을 향상시킬 수 있습니다.

실제 애플리케이션에서는 스레드 안전을 보장하기위한 스레드 잠금 메커니즘을 도입하고 여러 리소스 유형의 정책 구성을 지원하는 것과 같은 스레드 잠금 메커니즘을 도입하는 등이 유형을 더욱 확장 할 수 있습니다.이 기사가 고성능 PHP 개발에 대한 실질적인 참조 및 영감을 제공 할 수 있기를 바랍니다.