現在の位置: ホーム> 最新記事一覧> dns_get_record関数のクエリパフォーマンスを最適化する方法は何ですか?

dns_get_record関数のクエリパフォーマンスを最適化する方法は何ですか?

M66 2025-06-22

1.キャッシュされた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要求を使用してCurlセッションを作成し、1つのリクエストが完了した直後に次のリクエストを作成します。これは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-DNSReact \ DNSなどのより効率的なサードパーティライブラリを使用すると、パフォーマンスが向上する可能性があります。これらのライブラリは通常、非同期サポート、DNSキャッシュ、およびより豊富な機能を提供し、ニーズに基づいて適切なサポートを選択できます。

たとえば、 React \ DNSは非同期DNSクエリ機能を提供し、複数のDNSリクエストを同時に実行できるため、パフォーマンスが向上します。