Les requêtes DNS sont généralement des opérations longues, en particulier lors de l'interrogation au même nom de domaine plusieurs fois. Pour réduire les requêtes DNS fréquentes, un mécanisme de cache peut être utilisé pour stocker les enregistrements DNS résolus. Les résultats des requêtes DNS peuvent être mis en cache dans la mémoire, comme l'utilisation de l'APCU ou de la memcached , ou écrits dans la base de données. Chaque fois qu'un nom de domaine doit être interrogé, vérifiez d'abord s'il y a un enregistrement correspondant dans le cache. Si c'est le cas, les données du cache seront retournées directement sans DNS interroger à nouveau.
$domain = 'example.com';
$cacheKey = 'dns_' . md5($domain);
// Vérifiez le cache
if ($cachedRecord = apcu_fetch($cacheKey)) {
$records = $cachedRecord;
} else {
// mettre en œuvre DNS Requête
$records = dns_get_record($domain);
// 将Requête结果cache
apcu_store($cacheKey, $records, 3600); // cache 1 Heure
}
// Sortir DNS Enregistrer
print_r($records);
La fonction dns_get_record prend en charge plusieurs types de requête DNS (tels que A, AAAA, MX, etc.). Lorsque vous effectuez des requêtes DNS, vous devriez essayer de limiter les types de requête pour éviter d'interroger trop d'informations inutiles. Cela réduit la complexité et le temps de la requête. Par exemple, si vous ne vous souciez que de l'adresse IP, vous pouvez spécifier pour interroger l'enregistrement A ou l'enregistrement AAAA.
$domain = 'example.com';
$records = dns_get_record($domain, DNS_A); // 仅Requête A Enregistrer
print_r($records);
DNS_GET_RECORD est une opération de blocage, ce qui signifie qu'il attendra que la requête DNS se termine avant de renvoyer le résultat. Si vous devez interroger plusieurs noms de domaine en même temps, vous pouvez envisager d'utiliser des requêtes asynchrones pour améliorer l'efficacité. Plusieurs requêtes DNS peuvent être exécutées en parallèle pour réduire le temps de requête global.
Une pratique courante consiste à utiliser des extensions de boucle pour exécuter plusieurs requêtes DNS en parallèle. Par exemple, créez une session Curl avec plusieurs demandes d'URL et effectuez la demande suivante immédiatement une fois qu'une demande est terminée. Bien que cela n'utilise pas directement DNS_GET_RECORD , les performances peuvent être améliorées à d'autres égards.
$domains = ['example.com', 'test.com', 'm66.net'];
$multiCurl = [];
$mh = curl_multi_init();
// Créer plusieurs cURL demander
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]);
}
// mettre en œuvreRequête
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// Obtenir des résultats
foreach ($domains as $index => $domain) {
$response = curl_multi_getcontent($multiCurl[$index]);
echo "Domain: $domain\n";
echo $response . "\n";
}
// Fermer la connexion
foreach ($domains as $index => $domain) {
curl_multi_remove_handle($mh, $multiCurl[$index]);
}
curl_multi_close($mh);
Par défaut, le DNS_GET_RECORD de PHP obtiendra des enregistrements via le serveur de résolution DNS du système. Dans les scénarios de requête DNS à haute fréquence, l'utilisation d'un serveur DNS public tel que Google ou CloudFlare peut entraîner une latence élevée. Par conséquent, envisagez d'utiliser un serveur DNS déployé localement pour accélérer les requêtes DNS, en particulier dans les environnements intranet, ce qui peut réduire considérablement le temps de réponse des requêtes DNS.
Dans des environnements très concurrencés, la requête fréquente de certains noms de domaine peut provoquer une réponse lente des serveurs DNS. Pour distribuer la charge, plusieurs serveurs DNS peuvent être utilisés pour interroger et interroger via l'équilibrage de la charge DNS. Vous pouvez sélectionner manuellement plusieurs serveurs DNS pour la requête, ou configurer un serveur DNS de sauvegarde dans l'application pour changer automatiquement en cas de problème avec le serveur DNS principal.
$domains = ['example.com', 'm66.net'];
$dnsServers = ['8.8.8.8', '1.1.1.1']; // de rechange DNS serveur
$dnsServerIndex = 0;
// Changer DNS serveur
$records = dns_get_record($domains[0], DNS_A, $dnsServers[$dnsServerIndex]);
print_r($records);
Dans certains cas, des requêtes DNS fréquentes ne sont pas nécessaires, surtout lorsque les résultats de la requête ne changent pas fréquemment. Les performances peuvent être optimisées en retardant les requêtes ou en réduisant la fréquence des requêtes. Par exemple, les enregistrements DNS du nom de domaine peuvent être mis à jour régulièrement au lieu de faire des requêtes en temps réel à chaque fois. Pour les situations où le mécanisme de cache n'est pas applicable, vous pouvez éviter les requêtes DNS en double en définissant des intervalles de requête.
// Tous les autres 10 分钟才Requête一次 DNS Enregistrer
$lastChecked = time() - 600; // 假设上次Requête是在 10 Il y a quelques minutes
if (time() - $lastChecked >= 600) {
$records = dns_get_record('example.com');
// 更新Requête时间
$lastChecked = time();
print_r($records);
}
DNS_GET_GED NIGNE PHP peut ne pas convenir à tous les scénarios d'application. Dans certains cas, l'utilisation de bibliothèques tierces plus efficaces telles que PHP-DNS , React \ DNS , etc. peut conduire à de meilleures performances. Ces bibliothèques fournissent généralement un support asynchrone, une mise en cache DNS et des fonctionnalités plus riches, et vous pouvez choisir la bonne en fonction de vos besoins.
Par exemple, React \ DNS fournit des capacités de requête DNS asynchrones, permettant de exécuter simultanément plusieurs demandes DNS, améliorant ainsi les performances.