Dans PHP, la fonction dns_get_record () est un outil très pratique pour obtenir des informations d'enregistrement DNS pour un nom de domaine spécifié. Cette fonction offre aux développeurs la possibilité d'interroger des enregistrements directement à partir du serveur DNS et est largement utilisé dans le diagnostic du réseau, le développement du système de messagerie, la plate-forme d'outil de nom de domaine et d'autres scénarios.
Le prototype de fonction de dns_get_record () est le suivant:
<span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$type</span></span><span> = DNS_ANY [, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$authns</span></span><span> [, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$addtl</span></span><span> ]]] )
</span></span>
$ hostname : le nom d'hôte à requête (par exemple: example.com ).
$ Type : Le type d'enregistrement DNS pour la requête. Les types couramment utilisés comprennent:
DNS_A : adresse IPv4
DNS_AAAA : Adresse IPv6
DNS_MX : enregistrement d'échange de courrier
DNS_CNAME : Record d'alias
DNS_TXT : enregistrement de texte
DNS_NS : serveur de noms de domaine
DNS_SOA : Record de l'agence d'autorisation de démarrage
DNS_ANY : Tous types de dossiers
$ Authns (Facultatif): Renvoie les informations de serveur de noms faisant autorité.
$ addtl (facultatif): renvoie des enregistrements supplémentaires.
<span><span><span class="hljs-variable">$records</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span><span>(</span><span><span class="hljs-string">"example.com"</span></span><span>, DNS_A);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$records</span></span><span>);
</span></span>
Ce code renverra un tableau contenant tous les enregistrements, chaque élément est un tableau associatif contenant des champs tels que l'hôte , le type , l'IP , le TTL , etc.
<span><span><span class="hljs-variable">$mxRecords</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span><span>(</span><span><span class="hljs-string">"example.com"</span></span><span>, DNS_MX);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$mxRecords</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$record</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Mail Server: <span class="hljs-subst">{$record['target']}</span></span></span><span>, Priority: </span><span><span class="hljs-subst">{$record['pri']}</span></span><span>\n";
}
</span></span>
Pour utiliser cette fonction plus efficacement, il existe plusieurs conseils et suggestions pratiques:
Évitez d'utiliser DNS_ANY car cela demandera tous les types d'enregistrements à la fois, ce qui peut entraîner des surcharges de performances supplémentaires. Dans une utilisation réelle, seul le type d'enregistrement requis doit être interrogé.
dns_get_record () ne cache pas les résultats, et une requête DNS réelle est exécutée chaque fois que l'appel est appelé. Si vous devez interroger à plusieurs reprises le même nom de domaine pendant un cycle de vie d'application, il est recommandé de l'utiliser en conjonction avec un mécanisme de mise en cache (comme APCU ou Memcached):
<span><span><span class="hljs-variable">$cacheKey</span></span><span> = </span><span><span class="hljs-string">'dns_a_example_com'</span></span><span>;
</span><span><span class="hljs-variable">$records</span></span><span> = </span><span><span class="hljs-title function_ invoke__">apcu_fetch</span></span><span>(</span><span><span class="hljs-variable">$cacheKey</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$records</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$records</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span><span>(</span><span><span class="hljs-string">"example.com"</span></span><span>, DNS_A);
</span><span><span class="hljs-title function_ invoke__">apcu_store</span></span><span>(</span><span><span class="hljs-variable">$cacheKey</span></span><span>, </span><span><span class="hljs-variable">$records</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>); </span><span><span class="hljs-comment">// cache5minute</span></span><span>
}
</span></span>
FALSE sera renvoyé lorsque la requête DNS_GET_RECORD () échoue, de sorte que les vérifications de valeur de retour doivent toujours être effectuées dans des environnements de production:
<span><span><span class="hljs-variable">$records</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span><span>(</span><span><span class="hljs-string">"example.com"</span></span><span>, DNS_MX);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$records</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"DNS La requête a échoué"</span></span><span>);
</span><span><span class="hljs-comment">// Vous pouvez effectuer un mécanisme de secours ou des invites utilisateur en fonction de vos besoins</span></span><span>
}
</span></span>
Différents types de champs d'enregistrement DNS sont légèrement différents. Par exemple, il y a un champ IP dans l'enregistrement A , tandis qu'il y a PRI et Target dans l'enregistrement MX . Lors du traitement de ces données, vous devez prêter attention aux différences structurelles:
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$records</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$record</span></span><span>) {
</span><span><span class="hljs-keyword">switch</span></span><span> (</span><span><span class="hljs-variable">$record</span></span><span>[</span><span><span class="hljs-string">'type'</span></span><span>]) {
</span><span><span class="hljs-keyword">case</span></span><span> </span><span><span class="hljs-string">'A'</span></span><span>:
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"IP: "</span></span><span> . </span><span><span class="hljs-variable">$record</span></span><span>[</span><span><span class="hljs-string">'ip'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">break</span></span><span>;
</span><span><span class="hljs-keyword">case</span></span><span> </span><span><span class="hljs-string">'MX'</span></span><span>:
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"MX: "</span></span><span> . </span><span><span class="hljs-variable">$record</span></span><span>[</span><span><span class="hljs-string">'target'</span></span><span>] . </span><span><span class="hljs-string">" (Priority: "</span></span><span> . </span><span><span class="hljs-variable">$record</span></span><span>[</span><span><span class="hljs-string">'pri'</span></span><span>] . </span><span><span class="hljs-string">")\n"</span></span><span>;
</span><span><span class="hljs-keyword">break</span></span><span>;
}
}
</span></span>
La fonction DNS_GET_RECORD () de PHP fournit un moyen d'accéder directement aux enregistrements de résolution de noms de domaine, qui est très adapté aux scénarios où des requêtes DNS dynamiques sont nécessaires. En définissant rationnellement le type de requête, en ajoutant un mécanisme de cache et en structurant la valeur de retour de résolution, cette fonction peut être utilisée plus efficacement et en toute sécurité dans les applications réelles. Lors du développement de fonctions liées à DNS, dns_get_record () est un outil indispensable.