Antworten:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
den Domainnamen der Site nicht zurückgeben.
Dies ist ein alter Beitrag, aber verstehen Sie ihn damit:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Beispielsweise:
die( getLocalIp() );
Wenn Sie es auf einer anderen Site gefunden haben, entfernen Sie den Befehl trim nicht, da Sie sonst den Computernamen erhalten.
BACKTICKS (Die speziellen Anführungszeichen): Es funktioniert, weil PHP versucht, alles, was zwischen diesen "speziellen Anführungszeichen" (Backticks) liegt, als Shell-Befehl auszuführen und die resultierende Ausgabe zurückgibt.
gethostbyname(trim(`hostname`));
Ist sehr ähnlich (aber viel effizienter) als:
$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
, eine Loopback-IP (z. B. 127.0.0.1) für den Host-Computer zurückzugeben.
Versuchen Sie dies (wenn Ihr Server Linux ist):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
für die entsprechende Schnittstelle.
wlan0
statt eth0
und zu ersetzen 'inet addr:'
mit 'inet adr:'
, möglicherweise aufgrund der locale auf meinem System (fr_FR). Davon abgesehen war diese Antwort die Lösung, nach der ich gesucht habe. Vielen Dank!
'inet adr:'
funktionierte eigentlich in meinem Terminal (französisches Gebietsschema), aber im PHP-Skript 'inet addr:'
war der richtige Wert (englisches Gebietsschema, denke ich).
Die standardmäßige externe IP-Adresse des lokalen Computers kann wie folgt abgerufen werden:
$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;
Wie es funktioniert:
Da dies UDP ist, socket_connect
geht es nicht ins Netzwerk. Es wird dem Socket nur eine lokale Adresse und ein lokaler Port zugewiesen. Dadurch können wir die lokale Adresse erhalten.
Diese Lösung funktioniert ohne Netzwerkverkehr, DNS oder Befehlsausführung.
Es funktioniert möglicherweise nicht, wenn es keine Route zu gibt 8.8.8.8
(z. B. wenn Sie keine Internetverbindung haben).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
Modul auf PHP installiert und aktiviert sein sollte.
Kommt darauf an, was du mit lokal meinst:
Wenn mit lokal die Adresse des Servers / Systems gemeint ist, auf dem der PHP-Code ausgeführt wird, gibt es noch zwei Möglichkeiten. Wenn PHP über einen Webserver ausgeführt wird, können Sie die Serveradresse durch Lesen abrufen $_SERVER['SERVER_ADDR']
. Wenn PHP über eine Befehlszeilenschnittstelle ausgeführt wird, müssten Sie wahrscheinlich ipconfig
(Windows) / ifconfig
(* nix) unter Shell ausführen und die Adresse ermitteln.
Wenn mit lokal die Remote-Adresse des Website-Besuchers gemeint ist, nicht jedoch dessen externe IP-Adresse (da Sie ausdrücklich 192 * angegeben haben), haben Sie kein Glück. Der Sinn des NAT-Routings besteht darin, diese Adresse zu verbergen. Sie können die lokalen Adressen einzelner Computer hinter einer IP-Adresse nicht identifizieren. Es gibt jedoch einige Tricks (Benutzeragent, möglicherweise Mac-Adresse), mit denen Sie unterscheiden können, ob mehrere Computer von derselben IP-Adresse aus zugreifen.
Sie können dies als regulärer Benutzer in der CLI auf einem Linux-Host versuchen:
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);
Ausgabe:
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', )
Ich schaff das. Ich habe diesen Code in der PHP-Datei hinzugefügt,
split()
Funktion wurde ab PHP 5.3.0 VERRINGERT. explode()
$localIP = gethostbyname(trim(exec("hostname")));
Ich habe versucht, in Windows-PC und es hat funktioniert und denke auch, dass unter Linux funktioniert.
Es ist sehr einfach und die obigen Antworten erschweren die Sache. Mit dieser Methode können Sie einfach sowohl lokale als auch öffentliche IP-Adressen abrufen.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Es ist einfach. Sie können den Hostnamen durch diesen einfachen Code erhalten.
$ip = getHostByName(getHostName());
Sie können auch $_SERVER['HTTP_HOST']
den Hostnamen abrufen.
Ich habe mit dieser Frage für ein serverseitiges PHP (läuft vom Linux-Terminal) herumgespielt.
Ich habe 'ifconfig' explodiert und auf die IP-Adresse gekürzt.
Hier ist es:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Und natürlich ändern Sie 'wlan0' auf Ihr gewünschtes Netzwerkgerät.
Meine Ausgabe ist:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Gibt den Dateinamen des aktuellen Skripts mit dem Pfad relativ zum Stamm zurück
SERVER_PROTOCOL
Gibt den Namen und die Revision des von der Seite angeforderten Protokolls zurück
REQUEST_METHOD
Gibt die Anforderungsmethode zurück, die für den Zugriff auf die Seite verwendet wird
DOCUMENT_ROOT
Gibt das Stammverzeichnis zurück, unter dem das aktuelle Skript ausgeführt wird
Versuche dies
$localIP = gethostbyname(trim('hostname'));