2009-09-02 5 views

Antwort

15

Dieser kann mit curl durchgeführt werden, mit dem Vorteil, neben der curl request/response keinen weiteren Netzwerkverkehr zu haben. DNS-Anfragen werden durch curl gemacht, um die IP-Adressen zu erhalten, die im ausführlichen Bericht zu finden sind. So:

  • Schalten Sie CURLOPT_VERBOSE ein.
  • Direct CURLOPT_STDERR zu einem "php: // temp" Stream Wrapper Ressource.
  • Mit preg_match_all(), parse die Ressource Zeichenfolge Inhalt für die ip Adresse (n).
  • Die antwortenden Server-Adressen werden werden in der Nulltaste Subarray Begegnung Array.
  • Die Adresse des Servers kann den Inhalt (unter der Annahme einer erfolgreichen Anfrage) mit end() ausliefern abgerufen. Alle dazwischen liegenden Server-Adressen befinden sich ebenfalls in dem Subarray, in der Reihenfolge.

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.231 

function 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; 
    } 
} 
0

AFAIK kann man nicht ‚Kraft‘ der Server Sie seine IP-Adresse in der Antwort zu senden. Warum nicht direkt nachsehen? (Check this question/answers for how to do that from php)

+0

Der Server besteht aus mehreren ausgeführten Instanzen. Daher muss ich genau herausfinden, mit welchem ​​Server ich mich verbunden habe, und für eine bestimmte CURL-Anfrage geantwortet. – Beier

3

Ich glaube nicht, dass es eine Möglichkeit gibt, dass die IP-Adresse direkt von Locke zu bekommen.
Aber so etwas wie dies könnte den Trick:

Erstens hat die Locke Anfrage, und verwenden Sie curl_getinfo die „echte“ URL zu erhalten, die abgerufen wurde - dies ist, weil die erste URL zu einem anderen umleiten kann, und Sie wollen die finalen:

$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/ 

verwenden Sie dann parse_url den „host“ Teil von dieser letzten URL zu extrahieren:

$host = parse_url($real_url, PHP_URL_HOST); 
var_dump($host);  // www.google.fr 

und schließlich verwenden gethostbyname t o die IP-Adresse erhalten, die auf diesem Host entsprechen:

$ip = gethostbyname($host); 
var_dump($ip);   // 209.85.227.99 

Nun ...
, dass eine Lösung ist ^^ Es ist in den meisten Fällen funktionieren sollte, nehme ich an - obwohl ich nicht sicher bin, würden Sie immer erhalten die „richtige“ führen, wenn es irgendeine Art von Load-Balancing mecanism ist ...

3
echo '<pre>'; 
print_r(gethostbynamel($host)); 
echo '</pre>'; 

das gibt Ihnen die alle IP-Adressen mit dem angegebenen Hostnamen zugeordnet ist.

-1

ich verwenden, um diesen ein

<? 
$hosts = gethostbynamel($hostname); 
if (is_array($hosts)) { 
    echo "Host ".$hostname." resolves to:<br><br>"; 
    foreach ($hosts as $ip) { 
      echo "IP: ".$ip."<br>"; 
    } 
} else { 
    echo "Host ".$hostname." is not tied to any IP."; 
} 
?> 

von hier: http://php.net/manual/en/function.gethostbynamel.php

3

Ich denke, Sie sollten mit der IP-Adresse zu erhalten, von dem Server in der Lage sein:

$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