PHP comment obtenir l'adresse IP locale du système


96

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

J'ai besoin de l'adresse IP du système exécutant 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.

Réponses:


111

Depuis CLI

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
C'est la solution qui a fonctionné pour moi et qui évite d'appeler des shells, des commandes du système d'exploitation et toutes sortes de choses qui peuvent ouvrir des failles de sécurité ou soulever des problèmes étranges plus tard.
Dario Fumagalli

1
La meilleure réponse vient généralement avec la simplicité. Comme ça.
m3nda

1
@ andras.tim J'aime les réponses simples, mais quand j'ai exécuté votre script, il ne renvoie pas l'adresse IP de ma machine, il renvoie l'adresse IP utilisée dans ma machine virtuelle ... quel pourrait être le problème?
Scarl

soyez juste conscient, cette approche repose sur la résolution correcte du DNS quel que soit le nom d'hôte du système. ce ne sera pas toujours le cas.
Justin McAleer du

3
Dans un environnement d'hébergement cloud, cela peut ne pas renvoyer le résultat attendu. Parce que chaque hôte a plus de 2 IP.
UnixAgain

60
$_SERVER['SERVER_ADDR']

13
Précision: un ordinateur peut avoir plusieurs adresses IP. Cette variable est uniquement HTTP et contient l'adresse IP sur laquelle l'hôte virtuel s'exécute. Étant donné le caractère vague de la question, il est difficile de dire si c'est la réponse attendue.
Álvaro González

Je pense que c'est correct, car vous avez toujours besoin de l'adresse IP attribuée, celle qui vous répond. Sinon, vous devez utiliser asnwers @ andras.tim, car vous indique l'adresse IP principale du système.
m3nda

C'est exactement ce que je voulais, car mes serveurs sont derrière un équilibreur de charge et getHostNamene renvoie donc pas le nom de domaine du site.
Yep_It's_Me

Cela ne fonctionne pas si vous utilisez un conteneur docker
Freedo

30

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

7
@paul: En raison des guillemets spéciaux, lorsque vous utilisez des guillemets normaux, cela ne fonctionne pas pour une raison quelconque et lorsque vous supprimez la commande Trim, cela ne fonctionne même pas. Cela semble bizarre je sais. Il n'est pas agréable de voter contre la réponse à cela. Lisez la réponse.
Codebeat

2
Les backticks (`) sont appelés l'opérateur d'exécution en PHP. Ce que vous faites dans le premier bloc de code est presque identique à la commande exec. Voir PHP: Execution Operators - Manual
Christiaan

2
Pas vraiment la meilleure idée. Il est possible et valide gethostbynamede renvoyer une adresse IP de bouclage (par exemple 127.0.0.1) pour la machine hôte.
personne

2
Cela m'aide beaucoup, je pensais qu'il y aurait une simple fonction PHP comme $ _SERVER ['REMOTE_ADDR']; qui n'a pas fonctionné, mais cette solution a fonctionné pour moi !!!
Pini Cheyni

24

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;

9
Pas tout à fait raison. Il n'y a aucune garantie que eth0l'interface appropriée.
personne

Merci, cela a parfaitement fonctionné pour moi. Être capable de définir l'interface a aidé!
Rahim Khoja

Dans mon cas (IP locale dans le réseau local WiFi), j'ai dû spécifier à la wlan0place eth0et 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!
Niavlys

Eh bien en fait 'inet adr:'fonctionné dans mon terminal (langue française), mais dans le script PHP 'inet addr:'était la valeur correcte (locale anglaise, je suppose).
Niavlys

20

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_connectne 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).


3
Cette réponse est bien meilleure que les autres. Toute dépendance vis-à-vis du tableau $ _SERVER dépend de son exécution sous Apache. Cette idée fonctionne également sur un travail cron. Je ne l'utilise que pour exécuter certaines fonctions si un serveur s'exécute sur le réseau de transfert ou de production. Parfait!
Per

C'est une réponse élégante. Je l'ai adapté dans un script gérant les conteneurs docker pour obtenir l'ip de mon hôte sur le réseau docker:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn

C'est plus portable, je suppose. En outre, il est important de mentionner que le socketsmodule doit être installé et activé sur PHP.
Fabio Montefuscolo

oui, merci beaucoup @Arnaud Le Blanc, c'est très utile pour moi, j'ai obtenu mon adresse IP avec cette technique
Abid Ali

c'est ce que je recherche. Merci!
Jorz le

15

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.


1
Enfin, ipconfig / ifconfig renverra probablement plusieurs adresses IP: car un ordinateur n'a normalement pas une seule adresse. Très bonne réponse.
Álvaro González

oui, tout l'intérêt de NAT est de masquer l'adresse IP locale maintenant consultez whatismyip.com ils connaissent votre adresse IP interne, ouvrez également ce site Web en utilisant votre mobile, ils connaissent également l'adresse IP locale de votre mobile. EDIT: J'utilise JioFi Router, sur mobile, j'utilise des données mobiles sur Android 9 AOSP Based rom
Rishabh Gusain

10

hostname (1) peut indiquer l'adresse IP:, hostname --ip-addressou comme le dit l'homme, il vaut mieux utiliserhostname --all-ip-addresses


6

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,
Chapeau de paille

Bonne réponse, merci. split()La fonction a été obsolète depuis PHP 5.3.0. alors suggérez d'utiliser à la explode()place
Thanu

4
$localIP = gethostbyname(trim(exec("hostname")));

J'ai essayé sur PC Windows et cela a fonctionné et je pense également que cela fonctionnera sous Linux.


4

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;

?>

2

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.


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

Ma sortie est:

192.168.1.5

0

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
$_SERVER['SERVER_NAME']

Cela a fonctionné pour moi.


-4
$_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


Tout est vrai, mais aussi tout à fait sans rapport avec la question qui a été posée. -1.
Mark Amery

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.