Muszę uzyskać lokalny adres IP komputera, np. 192. * .... Czy jest to możliwe z PHP?
Potrzebuję adresu IP systemu z uruchomionym skryptem, ale nie potrzebuję zewnętrznego adresu IP, potrzebuję adresu jego lokalnej karty sieciowej.
Odpowiedzi:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
nie zwracają nazwy domeny witryn.
To jest stary post, ale pobierz go za pomocą tego:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Na przykład:
die( getLocalIp() );
Znalazłeś go w innej witrynie, nie usuwaj polecenia trim, ponieważ w przeciwnym razie otrzymasz nazwę komputera.
BACKTICKS (Specjalne cudzysłowy): Działa, ponieważ PHP spróbuje uruchomić wszystko, co znajduje się pomiędzy tymi "specjalnymi cudzysłowami" (lewy apostrof) jako polecenie powłoki i zwróci wynik.
gethostbyname(trim(`hostname`));
Jest bardzo podobny (ale znacznie bardziej wydajny) niż robienie:
$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
jest zwrócenie adresu IP pętli zwrotnej (np. 127.0.0.1) dla maszyny hosta.
spróbuj tego (jeśli twój serwer to Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
że interfejs jest odpowiedni.
wlan0
zamiast eth0
i zastąpić 'inet addr:'
z 'inet adr:'
, prawdopodobnie ze względu na lokalizacji używane w moim systemie (fr_FR). Poza tym ta odpowiedź była rozwiązaniem, którego szukałem. Dzięki!
'inet adr:'
działało na moim terminalu (francuskie locale), ale w skrypcie PHP 'inet addr:'
była poprawna wartość (chyba angielskie ustawienie regionalne).
Domyślny zewnętrzny adres IP komputera lokalnego można uzyskać w następujący sposób:
$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;
Jak to działa:
Ponieważ jest to UDP, socket_connect
nie wychodzi w sieci. Przypisuje tylko lokalny adres i port do gniazda. To pozwala nam uzyskać lokalny adres.
To rozwiązanie działa bez ruchu sieciowego, DNS lub wykonywania poleceń.
Może nie działać, jeśli nie ma trasy do 8.8.8.8
(np. Nie masz połączenia z Internetem).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
moduł powinien być zainstalowany i włączony w PHP.
Zależy, co masz na myśli mówiąc o lokalnym:
Jeśli przez lokalny masz na myśli adres serwera / systemu wykonującego kod PHP, nadal istnieją dwie możliwości do omówienia. Jeśli PHP jest uruchamiane przez serwer WWW, możesz uzyskać adres serwera, czytając $_SERVER['SERVER_ADDR']
. Jeśli PHP jest uruchamiane przez interfejs wiersza poleceń, prawdopodobnie będziesz musiał wykonać polecenie powłoki ipconfig
(Windows) / ifconfig
(* nix) i odczytać adres.
Jeśli przez lokalny masz na myśli zdalny adres osoby odwiedzającej witrynę, ale nie jej zewnętrzny adres IP (skoro podałeś 192. *), to nie masz szczęścia. Celem routingu NAT jest ukrycie tego adresu. Nie można zidentyfikować lokalnych adresów poszczególnych komputerów za adresem IP, ale istnieją pewne sztuczki (agent użytkownika, prawdopodobnie adres MAC), które mogą pomóc w odróżnieniu wielu komputerów uzyskujących dostęp z tego samego adresu IP.
Możesz spróbować tego jako zwykły użytkownik w CLI na hoście 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);
Wynik:
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', )
Mam to. Dodałem ten kod w pliku php,
split()
funkcja została WYCOFANA w PHP 5.3.0. więc sugeruj użycie explode()
zamiast tego
$localIP = gethostbyname(trim(exec("hostname")));
Próbowałem na komputerze z systemem Windows i działało, a także myślę, że będzie działać na Linuksie.
Jest to bardzo proste, a powyższe odpowiedzi komplikują sprawę. Po prostu możesz uzyskać zarówno lokalne, jak i publiczne adresy IP za pomocą tej metody.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
To jest łatwe. Możesz uzyskać nazwę hosta za pomocą tego prostego kodu.
$ip = getHostByName(getHostName());
Możesz też użyć, $_SERVER['HTTP_HOST']
aby uzyskać nazwę hosta.
Bawiłem się tym pytaniem dla PHP po stronie serwera (działającego z terminala Linux)
Wyrzuciłem „ifconfig” i sprowadziłem do adresu IP.
Oto ona:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
I oczywiście zmień „wlan0” na żądane urządzenie sieciowe.
Mój wynik to:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Zwraca nazwę pliku bieżącego skryptu ze ścieżką względem katalogu głównego
SERVER_PROTOCOL
Zwraca nazwę i wersję protokołu żądanego strony
REQUEST_METHOD
Zwraca metodę żądania używaną do uzyskania dostępu do strony
DOCUMENT_ROOT
Zwraca katalog główny, w którym wykonywany jest bieżący skrypt
Spróbuj tego
$localIP = gethostbyname(trim('hostname'));