In PHP, the dns_get_record() function is a very practical tool used to retrieve DNS record information for a specified domain. This function provides developers the ability to query records directly from DNS servers and is widely applied in network diagnostics, mail system development, domain tool platforms, and other scenarios.
The function prototype of dns_get_record() is as follows:
<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 class="hljs-variable">$authns</span></span><span> [, </span><span><span class="hljs-keyword">array</span></span> &</span><span><span class="hljs-variable">$addtl</span></span><span> ]]] )
</span></span>
$hostname: The hostname to query (e.g., example.com).
$type: The DNS record type to query. Common types include:
DNS_A: IPv4 address
DNS_AAAA: IPv6 address
DNS_MX: Mail exchange records
DNS_CNAME: Canonical name (alias) records
DNS_TXT: Text records
DNS_NS: Name servers
DNS_SOA: Start of authority records
DNS_ANY: All types of records
$authns (optional): Returns authoritative name server information.
$addtl (optional): Returns additional records.
<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>
This code will return an array containing all A records, with each element being an associative array including fields like host, type, ip, ttl, and more.
<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>
To use this function more efficiently, here are some practical tips and recommendations:
Avoid using DNS_ANY because it requests all types of records at once, which may cause unnecessary performance overhead. In practice, only query the record types you actually need.
dns_get_record() does not cache results and performs a real DNS query every time it is called. If you need to repeatedly query the same domain during an application lifecycle, it is recommended to use a caching mechanism (such as APCu or Memcached) as shown below:
<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>);
<p></span>if ($records === </span>false) {<br>
</span>$records = </span>dns_get_record("example.com", DNS_A);<br>
</span>apcu_store($cacheKey, $records, 300); </span>// Cache for 5 minutes<br>
}<br>
</span></span>
dns_get_record() returns false if the query fails, so always check the return value in production environments:
<span><span><span class="hljs-variable">$records</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dns_get_record</span></span>("example.com", DNS_MX);
</span><span><span class="hljs-keyword">if</span></span> ($records === false) {
</span><span><span class="hljs-title function_ invoke__">error_log</span>("DNS query failed");
</span><span><span class="hljs-comment">// Implement fallback or user notification as needed</span>
}
</span>
Fields vary slightly between different DNS record types. For example, A records include an ip field, while MX records contain pri and target fields. Pay attention to these structural differences when processing data:
<span><span><span class="hljs-keyword">foreach</span></span> ($records as $record) {
switch ($record['type']) {
case 'A':
echo "IP: " . $record['ip'] . "\n";
break;
case 'MX':
echo "MX: " . $record['target'] . " (Priority: " . $record['pri'] . ")\n";
break;
}
}
</span></span>
PHP’s dns_get_record() function offers direct access to domain name resolution records, making it ideal for scenarios requiring dynamic DNS queries. By properly specifying query types, integrating caching mechanisms, and structurally parsing returned values, this function can be used more efficiently and securely in practical applications. When developing DNS-related features, dns_get_record() is an indispensable tool.