2009-09-02 19 views

Respuesta

15

Este puede hacerse con curl, con la ventaja de no tener otro tráfico de red además de la solicitud/respuesta de curl. Las solicitudes DNS se realizan mediante curl para obtener las direcciones IP, que se pueden encontrar en el informe detallado. Entonces:

  • Encienda el CURLOPT_VERBOSE.
  • Directo CURLOPT_STDERR a "php: // temp" recurso contendor de secuencia.
  • Usando preg_match_all(), analice el contenido de la cadena del recurso para las direcciones ip .
  • Las direcciones del servidor que responde serán en el subarreglo cero de la matriz de coincidencias.
  • La dirección del servidor de entrega de el contenido (suponiendo una exitosa solicitud ) se puede recuperar con end(). Las direcciones de los servidores intermedios también estarán en el subcampo , en orden.

Demostración:

$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 no puede 'forzar' al servidor a que le envíe su dirección IP en la respuesta. ¿Por qué no buscarlo directamente? (Verifique this question/answers for how to do that from php)

+0

el servidor consta de varias instancias en ejecución, por lo que debo averiguar exactamente a qué servidor me he conectado y respondido para una solicitud CURL particular. – Beier

3

No creo que haya una manera de obtener esa dirección IP directamente de curl.
Pero algo como esto podría hacer el truco:

En primer lugar, hacer la solicitud rizo, y el uso de curl_getinfo para obtener la URL "real" que ha sido exagerado - esto es debido a que la primera URL puede redirigir a otro, y quiere la final:

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

a continuación, utilice parse_url para extraer la parte "host" de que la URL final:

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

y, por último, utilizar gethostbyname t O obtener la dirección IP que corresponde a ese host:

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

...
Eso es una solución ^^ Se debe trabajar en la mayoría de los casos, supongo - aunque no estoy seguro de que siempre se obtendría la "correcta" número si hay algún tipo de MECANISMO de balanceo de carga ...

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

qué le dará todas las direcciones IP asociadas con el nombre de host determinado.

-1

que utilizan éste

<? 
$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."; 
} 
?> 

desde aquí: http://php.net/manual/en/function.gethostbynamel.php

3

Creo que debería ser capaz de obtener la dirección IP desde el servidor con:

$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 
Cuestiones relacionadas