Respuestas:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
que no devuelve el nombre de dominio del sitio.
Esta es una publicación antigua, pero consígala con esto:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Por ejemplo:
die( getLocalIp() );
Lo encontré en otro sitio, no elimine el comando de recorte porque de lo contrario obtendrá el nombre de la computadora.
BACKTICKS (Las comillas especiales): funciona porque PHP intentará ejecutar lo que sea que esté entre esas "comillas especiales" (comillas inversas) como un comando de shell y devuelve la salida resultante.
gethostbyname(trim(`hostname`));
Es muy similar (pero mucho más eficiente) que hacer:
$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS
gethostbyname
devolver una IP de bucle invertido (por ejemplo, 127.0.0.1) para la máquina host.
intente esto (si su servidor es Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
sea la interfaz adecuada.
wlan0
lugar de eth0
y reemplazar 'inet addr:'
con 'inet adr:'
, posiblemente debido a la configuración regional utilizada en mi sistema (fr_FR). Aparte de eso, esta respuesta fue la solución que estaba buscando. ¡Gracias!
'inet adr:'
funcionó en mi terminal (configuración regional francesa), pero en el script PHP 'inet addr:'
estaba el valor correcto (configuración regional en inglés, supongo).
La dirección IP externa predeterminada de la máquina local se puede obtener así:
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference
$localAddr = $name;
Cómo funciona:
Dado que es UDP, socket_connect
no se conecta a la red. Solo asigna una dirección local y un puerto al socket. Esto nos permite obtener la dirección local.
Esta solución funciona sin tráfico de red, DNS o ejecución de comandos.
Puede que no funcione si no hay una ruta hacia 8.8.8.8
(por ejemplo, no tiene conexión a Internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
módulo debe estar instalado y habilitado en PHP.
Depende de lo que quieras decir con local:
Si por local te refieres a la dirección del servidor / sistema que ejecuta el código PHP, aún quedan dos vías por discutir. Si PHP se ejecuta a través de un servidor web, puede obtener la dirección del servidor leyendo $_SERVER['SERVER_ADDR']
. Si PHP se está ejecutando a través de una interfaz de línea de comandos, entonces probablemente tendrá que ejecutar shell ipconfig
(Windows) / ifconfig
(* nix) y extraer la dirección.
Si por local te refieres a la dirección remota del visitante del sitio web, pero no a su dirección IP externa (ya que dijiste específicamente 192. *), entonces no tienes suerte. El objetivo del enrutamiento NAT es ocultar esa dirección. No puede identificar las direcciones locales de computadoras individuales detrás de una dirección IP, pero hay algunos trucos (agente de usuario, posiblemente dirección mac) que pueden ayudar a diferenciar si hay varias computadoras accediendo desde la misma IP.
Puede intentar esto como usuario habitual en CLI en un host Linux:
function get_local_ipv4() {
$out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
$local_addrs = array();
$ifname = 'unknown';
foreach($out as $str) {
$matches = array();
if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
$ifname = $matches[1];
if(strlen($matches[2])>0) {
$ifname .= $matches[2];
}
} elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
$local_addrs[$ifname] = $matches[1];
}
}
return $local_addrs;
}
$addrs = get_local_ipv4();
var_export($addrs);
Salida:
array (
'eth0' => '192.168.1.1',
'eth0:0' => '192.168.2.1',
'lo' => '127.0.0.1',
'vboxnet0' => '192.168.56.1',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
Tengo esto. Agregué este código en un archivo php,
split()
La función ha sido DEPRECADA a partir de PHP 5.3.0. sugiera usar en su explode()
lugar
$localIP = gethostbyname(trim(exec("hostname")));
Lo intenté en una PC con Windows y funcionó y también creo que funcionará en Linux.
Es muy simple y las respuestas anteriores están complicando las cosas. Simplemente puede obtener direcciones IP locales y públicas utilizando este método.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Es fácil. Puede obtener el nombre de host con este simple código.
$ip = getHostByName(getHostName());
O también puede usar $_SERVER['HTTP_HOST']
para obtener el nombre de host.
Jugué con esta pregunta para un php del lado del servidor (que se ejecuta desde la terminal de Linux)
Exploté 'ifconfig' y lo reduje a la dirección IP.
Aquí está:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Y, por supuesto, cambie 'wlan0' a su dispositivo de red deseado.
Mi salida es:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Devuelve el nombre de archivo del script actual con la ruta relativa a la raíz
SERVER_PROTOCOL
Devuelve el nombre y la revisión del protocolo solicitado por la página.
REQUEST_METHOD
Devuelve el método de solicitud utilizado para acceder a la página.
DOCUMENT_ROOT
Devuelve el directorio raíz en el que se está ejecutando el script actual.
Prueba esto
$localIP = gethostbyname(trim('hostname'));