현재 위치: > 최신 기사 목록> DNS_GET_RECORD 함수의 쿼리 성능을 최적화하는 방법은 무엇입니까?

DNS_GET_RECORD 함수의 쿼리 성능을 최적화하는 방법은 무엇입니까?

M66 2025-06-22

1. CACHED DNS 쿼리 결과

DNS 쿼리는 일반적으로 동일한 도메인 이름을 여러 번 쿼리 할 때 일반적으로 시간이 많이 걸리는 작업입니다. 빈번한 DNS 쿼리를 줄이기 위해 캐시 메커니즘을 사용하여 해결 된 DNS 레코드를 저장할 수 있습니다. DNS 쿼리의 결과는 APCU 또는 Memcached 사용과 같은 메모리로 캐싱되거나 데이터베이스에 기록 될 수 있습니다. 도메인 이름을 쿼리해야 할 때마다 먼저 캐시에 해당 레코드가 있는지 확인하십시오. 그렇다면 캐시의 데이터는 DNS 쿼리없이 직접 반환됩니다.

 $domain = 'example.com';
$cacheKey = 'dns_' . md5($domain);

// 캐시를 확인하십시오
if ($cachedRecord = apcu_fetch($cacheKey)) {
    $records = $cachedRecord;
} else {
    // 구현하다 DNS 질문
    $records = dns_get_record($domain);
    // 将질문结果은닉처
    apcu_store($cacheKey, $records, 3600); // 은닉처 1 시간
}

// 산출 DNS 기록
print_r($records);

2. 쿼리 유형을 제한합니다

DNS_GET_RECORD 함수는 여러 DNS 쿼리 유형 (예 : A, AAAA, MX 등)을 지원합니다. DNS 쿼리를 수행 할 때는 너무 많은 불필요한 정보를 쿼리하지 않도록 쿼리 유형을 제한해야합니다. 이것은 쿼리의 복잡성과 시간을 줄입니다. 예를 들어, IP 주소에만 관심이있는 경우 A 레코드 또는 AAAA 레코드를 쿼리하도록 지정할 수 있습니다.

 $domain = 'example.com';
$records = dns_get_record($domain, DNS_A); // 仅질문 A 기록

print_r($records);

3. 비동기 쿼리를 사용하십시오

DNS_GET_RECORD 는 차단 작업입니다. 즉, 결과를 반환하기 전에 DNS 쿼리가 완료 될 때까지 기다립니다. 여러 도메인 이름을 동시에 쿼리 해야하는 경우 비동기 쿼리를 사용하여 효율성을 향상시키는 것을 고려할 수 있습니다. 전체 쿼리 시간을 줄이기 위해 여러 DNS 쿼리를 병렬로 실행할 수 있습니다.

일반적인 관행은 CURL 확장을 사용하여 여러 DNS 쿼리를 병렬로 실행하는 것입니다. 예를 들어, 여러 URL 요청이 포함 된 컬 세션을 작성하고 한 요청이 완료된 후 즉시 다음 요청을하십시오. 이것은 dns_get_record를 직접 사용하지 않지만 다른 방식으로 성능을 향상시킬 수 있습니다.

 $domains = ['example.com', 'test.com', 'm66.net'];
$multiCurl = [];
$mh = curl_multi_init();

// 다중 생성 cURL 묻다
foreach ($domains as $index => $domain) {
    $multiCurl[$index] = curl_init();
    curl_setopt($multiCurl[$index], CURLOPT_URL, 'http://' . $domain);
    curl_setopt($multiCurl[$index], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $multiCurl[$index]);
}

// 구현하다질문
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

// 결과를 얻으십시오
foreach ($domains as $index => $domain) {
    $response = curl_multi_getcontent($multiCurl[$index]);
    echo "Domain: $domain\n";
    echo $response . "\n";
}

// 연결을 닫으십시오
foreach ($domains as $index => $domain) {
    curl_multi_remove_handle($mh, $multiCurl[$index]);
}
curl_multi_close($mh);

4. 로컬 DNS 서버를 사용하십시오

기본적으로 PHP의 DNS_GET_RECORD는 시스템의 DNS 해상도 서버를 통해 레코드를 얻습니다. 고주파 DNS 쿼리 시나리오에서 Google 또는 CloudFlare와 같은 공개 DNS 서버를 사용하면 대기 시간이 높아질 수 있습니다. 따라서 로컬로 배포 된 DNS 서버를 사용하여 특히 인트라넷 환경에서 DNS 쿼리를 가속화하여 DNS 쿼리의 응답 시간을 크게 줄일 수 있습니다.


5. DNS 폴링을 사용하십시오

동시성 환경에서 특정 도메인 이름을 자주 쿼리하면 DNS 서버의 응답이 느리게 발생할 수 있습니다. 로드를 배포하려면 다중 DNS 서버를 사용하여 DNS로드 밸런싱을 통해 설문 조사 및 쿼리를 할 수 있습니다. 쿼리를 위해 여러 DNS 서버를 수동으로 선택하거나 응용 프로그램에서 백업 DNS 서버를 설정하여 기본 DNS 서버에 문제가있을 때 자동으로 전환 할 수 있습니다.

 $domains = ['example.com', 'm66.net'];
$dnsServers = ['8.8.8.8', '1.1.1.1']; // 여분의 DNS 섬기는 사람
$dnsServerIndex = 0;

// 스위치 DNS 섬기는 사람
$records = dns_get_record($domains[0], DNS_A, $dnsServers[$dnsServerIndex]);
print_r($records);

6. DNS 쿼리의 주파수를 줄입니다

경우에 따라 쿼리 결과가 자주 변경되지 않을 때 빈번한 DNS 쿼리가 필요하지 않습니다. 쿼리를 지연 시키거나 쿼리 주파수를 줄임으로써 성능을 최적화 할 수 있습니다. 예를 들어, 도메인 이름의 DNS 레코드는 매번 실시간 쿼리를 수행하는 대신 정기적으로 업데이트 될 수 있습니다. 캐시 메커니즘이 적용되지 않는 상황의 경우 쿼리 간격을 설정하여 중복 DNS 쿼리를 피할 수 있습니다.

 // 그 밖의 모든 10 分钟才질문一次 DNS 기록
$lastChecked = time() - 600; // 假设上次질문是在 10 몇 분 전

if (time() - $lastChecked >= 600) {
    $records = dns_get_record('example.com');
    // 更新질문时间
    $lastChecked = time();
    print_r($records);
}

7. 적절한 DNS 쿼리 라이브러리를 선택하십시오

PHP 네이티브 DNS_GET_RECORD는 모든 응용 프로그램 시나리오에 적합하지 않을 수 있습니다. 경우에 따라 PHP-DNS , React \ DNS 등과 같은보다 효율적인 타사 라이브러리를 사용하면 성능이 향상 될 수 있습니다. 이 라이브러리는 일반적으로 비동기 지원, DNS 캐싱 및 더 풍부한 기능을 제공하며 필요에 따라 올바른 것을 선택할 수 있습니다.

예를 들어, React \ DNS는 비동기 DNS 쿼리 기능을 제공하여 여러 DNS 요청을 동시에 실행하여 성능을 향상시킬 수 있습니다.