현재 위치: > 최신 기사 목록> Curl_share_init ()를 사용하여 Redis 프록시 DNS 캐시 메커니즘을 구현하십시오.

Curl_share_init ()를 사용하여 Redis 프록시 DNS 캐시 메커니즘을 구현하십시오.

M66 2025-05-31

동시 네트워크 요청 시나리오에서 DNS 해상도는 종종 요청 효율에 영향을 미치는 병목 현상이됩니다. 특히 데이터 액세스에 Redis 프록시를 사용할 때 자주 DNS 쿼리는 대기 시간을 추가 할뿐만 아니라 서버에 추가 부담을줍니다. 이 기사는 PHP의 Curl_share_init () 함수를 사용하여 효율적인 Redis 프록시 DNS 캐시 메커니즘을 구현하여 요청 효율성 및 캐시 관리 기능을 향상시키는 방법을 소개합니다.

1. 배경 소개

PHP의 Curl은 HTTP 요청을 처리하기위한 일반적인 라이브러리입니다. CURL_SHARE_INIT () 는 CURL에서 제공하는 공유 핸들 메커니즘으로 여러 CURL 세션이 DNS 캐시, 쿠키 및 연결 풀과 같은 데이터를 공유 할 수 있습니다. 공유 DNS 캐시는 중복 DNS 해상도를 피하고 요청 대기 시간을 줄일 수 있습니다.

Redis 프록시는 일반적으로 Redis.m66.net 과 같은 특정 도메인 이름을 통해 액세스됩니다. DNS 해상도가 모든 요청을 수행하면 시간이 걸릴뿐만 아니라 DNS 해상도의 오류의 위험을 초래할 수 있습니다. 공유 DNS 캐시를 사용하면 모든 컬 세션이 해결 된 IP를 재사용하여 요청 속도를 크게 향상시킬 수 있습니다.

2. curl_share_init ()를 사용하여 DNS 캐시 공유를 구현하십시오

2.1 공유 핸들 생성 및 DNS 캐시 옵션 설정

 <?php
// 공유 핸들을 초기화하십시오
$sh = curl_share_init();

// 공유를 설정하십시오 DNS 은닉처
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

Curlshopt_sharecurl_lock_data_dns 매개 변수는 공유 DNS 해상도 결과를 나타냅니다.

2.2 공유 핸들을 사용하여 여러 요청을 실행하십시오

 // 목표 Redis 연기 URL,도메인 이름이 대체되었습니다 m66.net
$urls = [
    "http://redis.m66.net/api/get_data",
    "http://redis.m66.net/api/set_data",
    "http://redis.m66.net/api/delete_data"
];

$multiCurl = [];
$mh = curl_multi_init();

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 공유 핸들 바인드,성취하다 DNS 은닉처共享
    curl_setopt($ch, CURLOPT_SHARE, $sh);

    curl_multi_add_handle($mh, $ch);
    $multiCurl[] = $ch;
}

// 다중 스레드 요청을 수행하십시오
do {
    $status = curl_multi_exec($mh, $active);
    curl_multi_select($mh);
} while ($active && $status == CURLM_OK);

// 결과를 얻으십시오
foreach ($multiCurl as $ch) {
    $response = curl_multi_getcontent($ch);
    echo "Response from " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) . ": " . $response . "\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);
curl_share_close($sh);
?>

2.3 코드 설명

  • curl_share_init () 로 공유 핸들 $ sh를 만들고 dns 구문 분석 데이터 만 공유하도록 설정하십시오.

  • Curlopt_share를 통해 여러 컬 세션이 공유 핸들에 묶여 DNS 캐시 공유를 구현합니다.

  • curl_multi를 사용하여 동시성 처리 효율을 향상시키기 위해 배치로 요청을 보내십시오.

  • 리소스를 자유롭게 할 때는 공유 핸들과 멀티 스레드 핸들을 닫으십시오.

3. 레 디스와 결합하여 더 미세한 과립 캐시 제어를 달성합니다.

DNS 캐시를 공유하는 것 외에도 Redis to Cache 요청 결과를 사용하여 Redis 프록시에 대한 요청 압력을 줄일 수도 있습니다.

Pseudocode 예제 :

 <?php
function fetchFromRedisProxy($url, $redis) {
    $cacheKey = 'proxy_cache:' . md5($url);
    $cached = $redis->get($cacheKey);

    if ($cached !== false) {
        return $cached;  // 直接返回은닉처数据
    }

    // 공유 핸들을 통해 요청을 실행합니다(단순화 된 예)
    $sh = curl_share_init();
    curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $sh);
    $response = curl_exec($ch);
    curl_close($ch);
    curl_share_close($sh);

    if ($response !== false) {
        // 设置은닉처,만료 시간60두번째
        $redis->setex($cacheKey, 60, $response);
    }
    return $response;
}
?>

4. 요약

공유 DNS 캐시는 PHP의 CURL_SHARE_INIT () 를 통해 구현되며, 이는 중복 DNS 쿼리를 크게 줄이고 Redis 프록시에 액세스하기위한 요청의 효율성을 향상시킬 수 있습니다. Redis 캐시 요청 결과를 사용하면 캐시를보다 효과적으로 관리하고 프록시 서버의 압력을 줄일 수 있습니다. 이 솔루션은 동시성이 높고 동일한 도메인 이름에 대한 빈번한 액세스가있는 시나리오에 적합하며 시스템의 전체 응답 속도 및 안정성을 향상시킬 수 있습니다.