Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Network Functions : gethostbyname

gethostbyname

Get the IP address corresponding to a given Internet host name (PHP 4, PHP 5)
string gethostbyname ( string hostname )

Example 1596. A simple gethostbyname() example

<?php
$ip
= gethostbyname('www.example.com');

echo
$ip;
?>

Related Examples ( Source code ) » gethostbyname



Code Examples / Notes » gethostbyname

von

When using PHP and Apache in a chroot environment on RedHat Linux, I have found that I need to bind-mount /var/run/nscd to get this to work. Apparently, the socket in that directory is needed for all the DNS things.

30-mar-2004 11:49

The dns entries get cached, whether they exist or not.  Expect really good response times after the first one.

guwapo

referring to ralphbolton at mail2sexy dot com comment:
(at least in 5.2.0 + djbdns-dnscache) gethostbyname does not really seem to cache entries. If somebody notices a speed-up after the second lookup of the same domain - that's most likely your dns-cache itself, not some php-internal dns-cache.
It does cache the entries in your /etc/resolv.conf (e.g. what dns to use) so I agree with him, that stopping and starting apache, will reload the resolv.conf.


peter
One way to discover your IP address automatically:
<?php
// need to trim() because whitespace will confuse the name lookup
$myIP = gethostbyname(trim(`hostname`));
echo $myIP;
?>


mmucklo

One note about using gethostbyname() for checking email address domains:
If the name doesn't resolve, follow up with getdnsrr() and make sure they don't have an MX entry before returning an error.
It is possible for a domain name not to have an A record, but still have an MX entry.


ralphbolton

On a side-note, PHP (5.0.4, but probably other versions too) can cache gethostbyname information.
In short, once PHP looks up an address, it may not actually perform another lookup as you may expect. In my particular case (I think) the problem was a change to resolv.conf didn't take effect inside PHP (although nslookup/ping etc worked fine). Stop/Starting Apache fixed it (although a simple 'restart' (kill -HUP) didn't).
In short, if you change resolv.conf, stop and restart Apache.


vincent

Note that if you pass an IP address to gethostbyname() it will return that IP address.

chris

mmucklo raises a valid point, however the function to use would be getmxrr() in the simplest case, or alternatively checkdnsrr() if you so wish; getdnsrr() does not exist.
On another note, it can be a pain (when iterating with while loops for example) that on failure gethostbyname() returns the hostname, rather than FALSE. You could wrap it in a simple user function, to "correct" this:
<?php
function fixed_gethostbyname ($host) {
// Try the lookup as normal...
$ip = gethostbyname($host);
// ...but if it fails, FALSE is returned instead of the unresolved host
if ($ip != $host) { return $ip; } else return false;
}
?>


marc m

Just a heads up. I was using this function on my site to verify email host addresses. I thought all was good, until a potential client contacted me and said they couldn't sign up correctly. They have a valid email address and domain, but this function failed.
Good luck.


jonathon dot reinhart

In response to Peter <toomuchphp-phpman at yahoo dot com>
$myIP = gethostbyname(trim(`hostname`));
In my situation this did not work. My server is sitting behind a NAT router, so it's IP address was 192.168.1.10.  So when I called your method, it returned 192.168.1.10, and never actually did the lookup.  To resolve this, I wrote this little function:
<?php
function look_me_up()
{
$records = dns_get_record( trim(`hostname --fqdn`) );
foreach($records as $record)
{
if ($record['type'] == 'A')
$ip = $record['ip'];
}
return $ip;
}
?>
Also note the use of --fqdn.  `hostname` in my case only returned 'hostname' instead of it's fully qualified domain name  hostname.example.com.


mcgrof

In PHP4 you can use gethostbyname() but I have found this unreliable when doing lookups on entries that return A records on the private network. PHP5 has a much better routine -- dns_get_record(). If you are stuck with PHP4 or don't want to upgrade you can use dig:
<?php
$ip = `/usr/bin/dig $host A +short`;
?>


florian holzhauer

If name resolution fails with apache2, mod_chroot and php5, add
LoadFile /lib/libnss_dns.so.2
to the mod_chroot config.


tabascopete78

I was using file_get_contents on a set of URLs. Some of them URLs were invalid (the structure of it was ok but the DNS hosts couldn't resolve them) and I kept getting an annoying warning. I wanted to check the DNS somehow but existing check dns function in php doesn't have one for windows and the one a person supplied there does not work 100% of the time.
Instead use this function to try to resolve a host. This won't throw any warnings, you just need to check the output. You'll get the same warnings with fopen and fsockopen.


christian

I had difficulty getting gethostbyname to work under OpenBSD 3.2 and Apache, until I discovered that the default Apache chroot caused the problem.
To get PHP's gethostbyname to work, you need resolv.conf (and possibly hosts) in /var/www/etc (assuming default install dirs).


josh finlay josh

gethostbyname and gethostbynamel does not ask for AAAA records. I have written two functions to implement this. gethostbyname6 and gethostbynamel6. I don't believe this issue has been addressed yet.
They are made to replace gethostbyname[l], in a way that if $try_a is true, if it fails to get AAAA records it will fall back on trying to get A records.
Feel free to correct any errors, I realise that it is asking for *both* A and AAAA records, so this means two DNS calls.. probably would be more efficient if it checked $try_a before making the query, but this works for me so I'll leave that up to someone else to implement in their own work.. the tip is out there now anyway..
Here is the code:
   function gethostbyname6($host, $try_a = false) {
       // get AAAA record for $host
       // if $try_a is true, if AAAA fails, it tries for A
       // the first match found is returned
       // otherwise returns false
       $dns = gethostbynamel6($host, $try_a);
       if ($dns == false) { return false; }
       else { return $dns[0]; }
   }
   function gethostbynamel6($host, $try_a = false) {
       // get AAAA records for $host,
       // if $try_a is true, if AAAA fails, it tries for A
       // results are returned in an array of ips found matching type
       // otherwise returns false
       $dns6 = dns_get_record($host, DNS_AAAA);
       if ($try_a == true) {
           $dns4 = dns_get_record($host, DNS_A);
           $dns = array_merge($dns4, $dns6);
       }
       else { $dns = $dns6; }
       $ip6 = array();
       $ip4 = array();
       foreach ($dns as $record) {
           if ($record["type"] == "A") {
               $ip4[] = $record["ip"];
           }
           if ($record["type"] == "AAAA") {
               $ip6[] = $record["ipv6"];
           }
       }
       if (count($ip6) < 1) {
           if ($try_a == true) {
               if (count($ip4) < 1) {
                   return false;
               }
               else {
                   return $ip4;
               }
           }
           else {
               return false;
           }
       }
       else {
           return $ip6;
       }
   }


ivan dot pirog

Function returns boolean:
<?php
function isDomainResolves($domain)
{
    return gethostbyname($domain) != $domain;
}
?>


cox

For doing basic RBL (Real Time Blacklist) lookups with this function do:
<?php
$host = '64.53.200.156';
$rbl  = 'sbl-xbl.spamhaus.org';
// valid query format is: 156.200.53.64.sbl-xbl.spamhaus.org
$rev = array_reverse(explode('.', $host));
$lookup = implode('.', $rev) . '.' . $rbl;
if ($lookup != gethostbyname($lookup)) {
   echo "ip: $host is listed in $rbl\n";
} else {
   echo "ip: $host NOT listed in $rbl\n";
}
?>
Tomas V.V.Cox


mcgrof

Better yet:
<?php
$ip = rtrim(`/usr/bin/dig $host A +short`);
?>


tonyhana

<?php
//script to time DNS propagation
//(Above script modified slightly to show micro time)
//seems pretty damn quick to me.. I'm getting .0055 sec worstcase badhost times.
//A known good dns name (my own)
$nametotest = "fuzzygroup.com";

//Call address test function
$time_start = getmicrotime();
testipaddress($nametotest);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "Good Host Search took $time seconds
";
//A known bad name (trust me)
$nametotest = "providence.mascot.com";
$time_start = getmicrotime();
testipaddress($nametotest);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "Bad Host Search took $time seconds
";


function getmicrotime(){
   list($usec, $sec) = explode(" ",microtime());
   return ((float)$usec + (float)$sec);
   }
//ip address checking function
//for real use should have a return value but example code
function testipaddress ($nametotest) {
$ipaddress = $nametotest;
$ipaddress = gethostbyname($nametotest);
if ($ipaddress == $nametotest) {
echo "No ip address for host
";
}
else {
echo "good hostname, $nametotest ipaddress = $ipaddress
";
}
}
//Recommended fix for sql applications:
// store url to temporary table
// run second process periodically to
// check urls and update main table
?>


sjohnson

<?php
//script to see if host exists on Internet
//following up on the above point about host name
//checking and SQL timeouts, run this test script
//and see how long it takes for 2nd call to
//hostname check to fail
//NOTE -- not PHP's fault -- nature of DNS
//A known good dns name (my own)
$nametotest = "fuzzygroup.com";

//Call address test function
testipaddress($nametotest);
//A known bad name (trust me)
$nametotest = "providence.mascot.com";
//Call address test function
testipaddress($nametotest);

//ip address checking function
//for real use should have a return value but example code
function testipaddress ($nametotest) {
$ipaddress = $nametotest;
$ipaddress = gethostbyname($nametotest);
if ($ipaddress == $nametotest) {
echo "No ip address for host, so host "
    . "not currently available in DNS and "
    . "probably offline for some time
";
}
else {
echo "good hostname, ipaddress = $ipaddress
";
}
}
//Recommended fix for sql applications:
// store url to temporary table
// run second process periodically to
// check urls and update main table
?>


Change Language


Follow Navioo On Twitter
checkdnsrr
closelog
debugger_off
debugger_on
define_syslog_variables
dns_check_record
dns_get_mx
dns_get_record
fsockopen
gethostbyaddr
gethostbyname
gethostbynamel
getmxrr
getprotobyname
getprotobynumber
getservbyname
getservbyport
header
headers_list
headers_sent
inet_ntop
inet_pton
ip2long
long2ip
openlog
pfsockopen
setcookie
setrawcookie
socket_get_status
socket_set_blocking
socket_set_timeout
syslog
eXTReMe Tracker