Risposte:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
non restituisce il nome di dominio del sito.
Questo è un vecchio post, ma prendilo con questo:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Per esempio:
die( getLocalIp() );
Trovato su un altro sito, non rimuovere il comando trim perché altrimenti otterrai il nome del computer.
BACKTICK (Le virgolette speciali): Funziona perché PHP tenterà di eseguire qualunque cosa si trovi tra quelle "virgolette speciali" (apici inversi) come comando di shell e restituirà l'output risultante.
gethostbyname(trim(`hostname`));
È molto simile (ma molto più efficiente) rispetto a:
$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
restituire un IP di loopback (es. 127.0.0.1) per la macchina host.
prova questo (se il tuo server è Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
l'interfaccia appropriata.
wlan0
posto di eth0
e sostituire 'inet addr:'
con 'inet adr:'
, forse a causa della locale utilizzata sul mio sistema (fr_FR). Oltre a questo, questa risposta era la soluzione che stavo cercando. Grazie!
'inet adr:'
funzionava bene nel mio terminale (locale francese), ma nello script PHP 'inet addr:'
era il valore corretto (locale inglese, immagino).
L'indirizzo IP esterno predefinito della macchina locale può essere ottenuto in questo modo:
$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;
Come funziona:
Poiché questo è UDP, socket_connect
non esce sulla rete. Assegna solo un indirizzo locale e una porta al socket. Questo ci permette di ottenere l'indirizzo locale.
Questa soluzione funziona senza alcun traffico di rete, DNS o esecuzione di comandi.
Potrebbe non funzionare se non esiste un percorso verso 8.8.8.8
(ad esempio, non si dispone di una connessione Internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
modulo deve essere installato e abilitato su PHP.
Dipende da cosa intendi per locale:
Se per locale intendi l'indirizzo del server / sistema che esegue il codice PHP, ci sono ancora due strade da discutere. Se PHP viene eseguito tramite un server Web, è possibile ottenere l'indirizzo del server leggendo $_SERVER['SERVER_ADDR']
. Se PHP viene eseguito tramite un'interfaccia a riga di comando, è probabile che sia necessario eseguire la shell ipconfig
(Windows) /ifconfig
(* nix) e estrarre l'indirizzo.
Se per locale intendi l'indirizzo remoto del visitatore del sito web, ma non il suo indirizzo IP esterno (dato che hai detto specificamente 192. *), allora sei sfortunato. Lo scopo del routing NAT è nascondere quell'indirizzo. Non è possibile identificare gli indirizzi locali dei singoli computer dietro un indirizzo IP, ma ci sono alcuni trucchi (agente utente, possibilmente indirizzo mac) che possono aiutare a distinguere se ci sono più computer che accedono dallo stesso IP.
Puoi provare questo come utente normale nella CLI sull'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);
Produzione:
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', )
Ho capito. Ho aggiunto questo codice nel file php,
split()
la funzione è stata DEPRECATA a partire da PHP 5.3.0. quindi suggerisci di usare explode()
invece
$localIP = gethostbyname(trim(exec("hostname")));
Ho provato su PC Windows e ha funzionato e penso anche che funzionerà su Linux.
È molto semplice e soprattutto le risposte complicano le cose. Semplicemente puoi ottenere indirizzi IP sia locali che pubblici usando questo metodo.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
È facile. Puoi ottenere il nome host con questo semplice codice.
$ip = getHostByName(getHostName());
Oppure puoi anche usare $_SERVER['HTTP_HOST']
per ottenere il nome host.
Ho giocherellato con questa domanda per un php lato server (in esecuzione dal terminale Linux)
Ho esploso "ifconfig" e l'ho ridotto all'indirizzo IP.
Ecco qui:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
E ovviamente cambia "wlan0" nel dispositivo di rete desiderato.
Il mio output è:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Restituisce il nome del file dello script corrente con il percorso relativo alla radice
SERVER_PROTOCOL
Restituisce il nome e la revisione del protocollo richiesto dalla pagina
REQUEST_METHOD
Restituisce il metodo di richiesta utilizzato per accedere alla pagina
DOCUMENT_ROOT
Restituisce la directory principale in cui viene eseguito lo script corrente
Prova questo
$localIP = gethostbyname(trim('hostname'));