In PHP, the gethostbyname function is a common method used to resolve a hostname into an IPv4 address. Its typical usage is straightforward:
However, as network environments gradually transition to IPv6, many developers wonder: is gethostbyname compatible with IPv6? Does it support resolving IPv6 addresses? Are there any potential issues? And how can these be resolved?
The gethostbyname function was designed based on the traditional IPv4 protocol. Its main function is to return the first IPv4 address string corresponding to a hostname. If the queried host does not have an IPv4 address and only has an IPv6 address, gethostbyname is likely unable to return a valid IP.
Simply put:
It only supports IPv4 address resolution.
It does not support IPv6 addresses.
If a hostname resolves only to an IPv6 address, the function usually returns the hostname itself (indicating resolution failure).
Example code:
This shows that gethostbyname has limited usability in pure IPv6 environments.
Cannot retrieve IPv6 addresses
gethostbyname only returns IPv4 addresses and cannot handle AAAA records, which are for IPv6 addresses.
Insufficient compatibility
In modern networks, more servers operate solely with IPv6 addresses, which gethostbyname cannot accommodate.
Potential errors
If your application depends on gethostbyname to obtain valid IPs, encountering purely IPv6 hosts may cause errors or logical inconsistencies.
To support IPv6, it is recommended to use more modern functions such as dns_get_record or PHP 7+’s getaddrinfo. Combining these with stream_socket_client also enables IPv6 support.
// Get all A and AAAA records
$records = dns_get_record($hostname, DNS_A + DNS_AAAA);
$ipv4s = [];
$ipv6s = [];
foreach ($records as $record) {
if ($record['type'] === 'A') {
$ipv4s[] = $record['ip'];
} elseif ($record['type'] === 'AAAA') {
$ipv6s[] = $record['ipv6'];
}
}
echo "IPv4 addresses:\n";
print_r($ipv4s);
echo "IPv6 addresses:\n";
print_r($ipv6s);
?>
This method can retrieve all IPv4 and IPv6 addresses associated with a hostname at once.
From PHP 7.0 onward, the sockets extension includes socket_getaddrinfo, which returns more comprehensive address information and supports both IPv4 and IPv6.
foreach ($results as $result) {
$ip = $result['address'];
echo "IP: $ip\n";
}
?>
This approach requires the sockets extension to be installed and supports IPv6 addresses.
In practical network programming, you can also use stream_socket_client to attempt connections supporting both IPv4 and IPv6:
$fp = @stream_socket_client("tcp://$hostname:$port", $errno, $errstr, 5);
if ($fp) {
$meta = stream_socket_get_name($fp, false);
echo "Connected via IP: $meta\n";
fclose($fp);
} else {
echo "Failed to connect: $errstr ($errno)\n";
}
?>
This method lets the underlying network stack automatically select the appropriate IP (IPv4 or IPv6).
gethostbyname only resolves IPv4 addresses and does not support IPv6, and it is increasingly regarded as outdated.
In IPv6 environments, gethostbyname may fail to resolve hostnames correctly or return invalid results.
It is recommended to use modern methods like dns_get_record or socket_getaddrinfo to retrieve both IPv4 and IPv6 addresses.
For network connections, use functions and interfaces that support IPv6 to ensure code compatibility with future network environments.