web-dev-qa-db-fra.com

PHP comment obtenir une adresse IP locale du système

J'ai besoin d'obtenir l'adresse IP locale de l'ordinateur tel que 192. * .... Est-ce possible avec PHP?

J'ai besoin de l'adresse IP du système qui exécute le script, mais je n'ai pas besoin de l'adresse IP externe, j'ai besoin de l'adresse de sa carte réseau locale.

84
air

De la CLI

PHP <5.3.0

$localIP = getHostByName(php_uname('n'));

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

100
andras.tim
$_SERVER['SERVER_ADDR']
55
Sergey Eremin

Ceci est un ancien post, mais obtenez-le avec ceci:

function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }

Par exemple:

die( getLocalIp() );

Si vous l'avez trouvé sur un autre site, ne supprimez pas la commande trim, sinon vous obtiendrez le nom de l'ordinateur.

BACKTICKS (Les guillemets spéciaux): Cela fonctionne parce que PHP va essayer de courir quoi que ce soit entre ces "guillemets spéciaux" (morsures) en tant que commande Shell et retourne la sortie résultante.

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
29
Codebeat

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;
24
George Deac

L'adresse IP externe par défaut de la machine locale peut être obtenue comme suit:

$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:

Comme il s'agit de UDP, socket_connect Ne sort pas sur le réseau. Il attribue uniquement une adresse locale et un port à la prise. Cela nous permet d’obtenir l’adresse locale.

Cette solution fonctionne sans aucun trafic réseau, DNS ou exécution de commande.

Cela peut ne pas fonctionner s'il n'y a pas de route vers 8.8.8.8 (Par exemple, vous n'avez pas de connexion Internet).

17
Arnaud Le Blanc

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, il reste encore deux pistes à discuter. Si PHP est en cours d'exécution un serveur Web, vous pouvez alors 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 Shell-execute ipconfig (Windows)/ifconfig (* nix) et annonce 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 indiqué 192. *), alors vous n'avez pas de chance. L’intérêt de NAT le routage est de masquer cette adresse. Vous ne pouvez pas identifier les adresses locales des ordinateurs individuels derrière une adresse IP, mais certaines astuces (agent utilisateur, éventuellement une adresse Mac) peuvent vous aider. aider à différencier si plusieurs ordinateurs accèdent à partir de la même adresse IP.

15
Fosco

nom d'hôte (1) peut indiquer l'adresse IP: hostname --ip-address ou, comme dit l’homme, il vaut mieux utiliser hostname --all-ip-addresses

10
ern0

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);

Sortie:

array (
  'eth0' => '192.168.1.1',
  'eth0:0' => '192.168.2.1',
  'lo' => '127.0.0.1',
  'vboxnet0' => '192.168.56.1',
)
6
ab1965
$localIP = gethostbyname(trim(exec("hostname")));

J'ai essayé dans Windows PC et Son a fonctionné et pense aussi que Will fonctionnera sous Linux.

4
Pratik Boda

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;

?>
1

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 votre périphérique réseau souhaité.

Ma sortie est:

192.168.1.5
1
Gonen

Si vous êtes dans un environnement de développement sur OS X, connecté via Wifi:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");
0
gpupo

C'est facile. Vous pouvez obtenir le nom d'hôte par ce simple code.

$ip = getHostByName(getHostName());

Ou vous pouvez aussi utiliser $_SERVER['HTTP_Host'] pour obtenir le nom d'hôte.

0
Kowsigan Atsayam