Réponses:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
ne renvoie donc pas le nom de domaine du site.
Ceci est un ancien message, mais obtenez-le avec ceci:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Par exemple:
die( getLocalIp() );
Trouvé sur un autre site, ne supprimez pas la commande trim car sinon vous obtiendrez le nom de l'ordinateur.
BACKTICKS (Les guillemets spéciaux): Cela fonctionne parce que PHP tentera d'exécuter tout ce qui se trouve entre ces "guillemets spéciaux" (backticks) comme une commande shell et renvoie le résultat obtenu.
gethostbyname(trim(`hostname`));
Est très similaire (mais beaucoup plus efficace) que de faire:
$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
de renvoyer une adresse IP de bouclage (par exemple 127.0.0.1) pour la machine hôte.
essayez ceci (si votre serveur est Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
l'interface appropriée.
wlan0
place eth0
et remplacer 'inet addr:'
par 'inet adr:'
, probablement en raison de la locale utilisée sur mon système (fr_FR). A part ça, cette réponse était la solution que je recherchais. Merci!
'inet adr:'
fonctionné dans mon terminal (langue française), mais dans le script PHP 'inet addr:'
était la valeur correcte (locale anglaise, je suppose).
L'adresse IP externe par défaut de la machine locale peut être obtenue comme ceci:
$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;
Comment ça fonctionne:
Puisque c'est UDP, socket_connect
ne sort pas sur le réseau. Il attribue uniquement une adresse et un port locaux au socket. Cela nous permet d'obtenir l'adresse locale.
Cette solution fonctionne sans trafic réseau, DNS ou exécution de commande.
Cela peut ne pas fonctionner s'il n'y a pas d'itinéraire vers 8.8.8.8
(par exemple, vous n'avez pas de connexion Internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
module doit être installé et activé sur PHP.
Cela dépend de ce que vous entendez par local:
Si par local vous entendez l'adresse du serveur / système exécutant le code PHP, alors il y a encore deux pistes à discuter. Si PHP est exécuté via un serveur Web, vous pouvez obtenir l'adresse du serveur en lisant $_SERVER['SERVER_ADDR']
. Si PHP est exécuté via une interface de ligne de commande, vous devrez probablement exécuter le shell ipconfig
(Windows) / ifconfig
(* nix) et extraire l'adresse.
Si par local, vous entendez l'adresse distante du visiteur du site Web, mais pas son adresse IP externe (puisque vous avez spécifiquement dit 192. *), alors vous n'avez pas de chance. L'intérêt du routage NAT est de cacher cette adresse. Vous ne pouvez pas identifier les adresses locales des ordinateurs individuels derrière une adresse IP, mais il existe quelques astuces (agent utilisateur, éventuellement adresse mac) qui peuvent aider à différencier s'il y a plusieurs ordinateurs accédant à partir de la même IP.
Vous pouvez essayer ceci en tant qu'utilisateur régulier dans la CLI sur l'hôte 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);
Production:
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', )
J'ai ça. J'ai ajouté ce code dans un fichier php,
split()
La fonction a été obsolète depuis PHP 5.3.0. alors suggérez d'utiliser à la explode()
place
$localIP = gethostbyname(trim(exec("hostname")));
J'ai essayé sur PC Windows et cela a fonctionné et je pense également que cela fonctionnera sous Linux.
C'est très simple et les réponses ci-dessus compliquent les choses. Vous pouvez simplement obtenir des adresses IP locales et publiques en utilisant cette méthode.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
C'est facile. Vous pouvez obtenir le nom d'hôte par ce simple code.
$ip = getHostByName(getHostName());
Ou vous pouvez également utiliser $_SERVER['HTTP_HOST']
pour obtenir le nom d'hôte.
J'ai tripoté cette question pour un php côté serveur (fonctionnant à partir d'un terminal Linux)
J'ai explosé 'ifconfig' et l'ai réduit à l'adresse IP.
C'est ici:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Et bien sûr, remplacez «wlan0» par le périphérique réseau souhaité.
Ma sortie est:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Renvoie le nom de fichier du script courant avec le chemin relatif à la racine
SERVER_PROTOCOL
Renvoie le nom et la révision du protocole demandé par la page
REQUEST_METHOD
Renvoie la méthode de requête utilisée pour accéder à la page
DOCUMENT_ROOT
Renvoie le répertoire racine sous lequel le script actuel s'exécute
Essaye ça
$localIP = gethostbyname(trim('hostname'));