PHP Curl, retrieving Server IP Address
This can be done with curl, with the advantage of having no other network traffic besides the curl request/response. DNS requests are made by curl to get the ip addresses, which can be found in the verbose report. So:
- Turn on CURLOPT_VERBOSE.
- Direct CURLOPT_STDERR to a"php://temp" stream wrapper resource.
- Using preg_match_all(), parse theresource's string content for the ipaddress(es).
- The responding server addresses willbe in the match array's zero-keysubarray.
- The address of the server deliveringthe content (assuming a successfulrequest) can be retrieved withend(). Any interveningservers' addresses will also be inthe subarray, in order.
Demo:
$url = 'http://google.com';$wrapper = fopen('php://temp', 'r+');$ch = curl_init($url);curl_setopt($ch, CURLOPT_VERBOSE, true);curl_setopt($ch, CURLOPT_STDERR, $wrapper);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$result = curl_exec($ch);curl_close($ch);$ips = get_curl_remote_ips($wrapper);fclose($wrapper);echo end($ips); // 208.69.36.231function get_curl_remote_ips($fp) { rewind($fp); $str = fread($fp, 8192); $regex = '/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/'; if (preg_match_all($regex, $str, $matches)) { return array_unique($matches[0]); // Array([0] => 74.125.45.100 [2] => 208.69.36.231) } else { return false; }}
I think you should be able to get the IP address from the server with:
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "http://stackoverflow.com");curl_exec($ch);$ip = curl_getinfo($ch,CURLINFO_PRIMARY_IP);curl_close($ch);echo $ip; // 151.101.129.69
I don't think there is a way to get that IP address directly from curl.
But something like this could do the trick :
First, do the curl request, and use curl_getinfo
to get the "real" URL that has been fetched -- this is because the first URL can redirect to another one, and you want the final one :
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$content = curl_exec($ch);$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);curl_close($ch);var_dump($real_url); // http://www.google.fr/
Then, use parse_url
to extract the "host" part from that final URL :
$host = parse_url($real_url, PHP_URL_HOST);var_dump($host); // www.google.fr
And, finally, use gethostbyname
to get the IP address that correspond to that host :
$ip = gethostbyname($host);var_dump($ip); // 209.85.227.99
Well...
That's a solution ^^ It should work in most cases, I suppose -- though I'm not sure you would always get the "correct" result if there is some kind of load-balancing mecanism...