Respostas:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
, não retorna o nome de domínio do site.
Esta é uma postagem antiga, mas comece assim:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Por exemplo:
die( getLocalIp() );
Encontrado em outro site, não remova o comando trim, pois caso contrário, você obterá o nome dos computadores.
BACKTICKS (as aspas especiais): Funciona porque o PHP tentará executar o que quer que esteja entre as "aspas especiais" (crases) como um comando shell e retorna a saída resultante.
gethostbyname(trim(`hostname`));
É muito semelhante (mas muito mais eficiente) do que fazer:
$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
retornar um IP de loopback (por exemplo, 127.0.0.1) para a máquina host.
tente isto (se o seu servidor for Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
é a interface apropriada.
wlan0
vez de eth0
e substituir 'inet addr:'
por 'inet adr:'
, possivelmente devido ao local usado em meu sistema (fr_FR). Fora isso, essa resposta era a solução que eu procurava. Obrigado!
'inet adr:'
funcionou bem no meu terminal (localidade francesa), mas no script PHP 'inet addr:'
estava o valor correto (localidade inglês, eu acho).
O endereço IP externo padrão da máquina local pode ser obtido desta forma:
$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;
Como funciona:
Por ser UDP, socket_connect
não sai da rede. Ele apenas atribui um endereço local e uma porta ao soquete. Isso nos permite obter o endereço local.
Esta solução funciona sem nenhum tráfego de rede, DNS ou execução de comandos.
Pode não funcionar se não houver rota para 8.8.8.8
(por exemplo, você não tem conexão com a Internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
módulo deve ser instalado e ativado no PHP.
Depende do que você entende por local:
Se por local você quer dizer o endereço do servidor / sistema que executa o código PHP, ainda há dois caminhos a serem discutidos. Se o PHP está sendo executado por meio de um servidor da web, você pode obter o endereço do servidor lendo $_SERVER['SERVER_ADDR']
. Se o PHP estiver sendo executado por meio de uma interface de linha de comando, você provavelmente terá que executar o shell ipconfig
(Windows) / ifconfig
(* nix) e executar o grep no endereço.
Se por local você quer dizer o endereço remoto do visitante do site, mas não seu endereço IP externo (já que você disse especificamente 192. *), então você está sem sorte. O objetivo do roteamento NAT é ocultar esse endereço. Você não pode identificar os endereços locais de computadores individuais por trás de um endereço IP, mas existem alguns truques (agente do usuário, possivelmente endereço mac) que podem ajudar a diferenciar se houver vários computadores acessando a partir do mesmo IP.
Você pode tentar isso como um usuário regular na CLI no 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);
Resultado:
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', )
Eu tenho esse. Eu adicionei este código em um arquivo php,
split()
função foi DESCONTINUADA a partir do PHP 5.3.0. por isso sugiro usar explode()
vez
$localIP = gethostbyname(trim(exec("hostname")));
Tentei no pc com Windows e funcionou e também acho que funcionará no Linux para.
É muito simples e as respostas acima complicam as coisas. Simplesmente você pode obter endereços IP locais e públicos usando este método.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
É fácil. Você pode obter o nome do host por este código simples.
$ip = getHostByName(getHostName());
Ou você também pode usar $_SERVER['HTTP_HOST']
para obter o nome do host.
Eu brinquei com esta questão para um php do lado do servidor (executando a partir de um terminal Linux)
Explodi 'ifconfig' e reduzi para o endereço IP.
Aqui está:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
E, claro, mude 'wlan0' para o dispositivo de rede desejado.
Minha saída é:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Retorna o nome do arquivo do script atual com o caminho relativo à raiz
SERVER_PROTOCOL
Retorna o nome e a revisão do protocolo solicitado pela página
REQUEST_METHOD
Retorna o método de solicitação usado para acessar a página
DOCUMENT_ROOT
Retorna o diretório raiz sob o qual o script atual está sendo executado
Tente isto
$localIP = gethostbyname(trim('hostname'));