web-dev-qa-db-fra.com

Comment trouver l'adresse IP de mon serveur en PHP (CLI)

Mis à part l'évidence (localhost, 127.0.0.1) PHP (interface en ligne de commande!) Dispose-t-il d'un mécanisme pour découvrir l'IP de l'ordinateur sur lequel le script s'exécute?

$_SERVER[*] ne fonctionnera pas car il ne s'agit pas d'une application Web - il s'agit d'un script de ligne de commande.

TIA

34
ChronoFish

Vous pouvez obtenir le nom d'hôte en utilisant gethostname

42
Nicolas Goy

essayez cela, il devrait retourner l'adresse IP du serveur

$Host= gethostname();
$ip = gethostbyname($Host);
32
Anish

Si vous travaillez avec PHP <5.3, cela peut aider (sur les systèmes basés sur * NIX au moins):

 mscharley@S04:~$ cat test.php
#!/usr/bin/env php
<?php

function getIPs($withV6 = true) {
    preg_match_all('/inet'.($withV6 ? '6?' : '').' addr: ?([^ ]+)/', `ifconfig`, $ips);
    return $ips[1];
}

$ips = getIPs();
var_dump($ips);

 mscharley@S04:~$ ./test.php
array(5) {
  [0]=>
  string(13) "72.67.113.141"
  [1]=>
  string(27) "fe80::21c:c0ff:fe4a:d09d/64"
  [2]=>
  string(13) "72.67.113.140"
  [3]=>
  string(9) "127.0.0.1"
  [4]=>
  string(7) "::1/128"
}
 mscharley@S04:~$

Ou, si vous ne prévoyez pas de le faire souvent, alors peut-être que cela fonctionnerait (ne l'abusez pas):

$ip = file_get_contents('http://whatismyip.org/');
14
Matthew Scharley

Je sais que c'est une question assez ancienne, mais il ne semble pas y avoir de réponse définitive (dans la mesure du possible.) J'ai eu besoin de déterminer cette valeur, à la fois sur les boîtes * NIX et sur Win X des boites. Également à partir d'un script exécuté par CLI ainsi que d'un script non-CLI. La fonction suivante est la meilleure que j'ai trouvée, qui emprunte à différents concepts dont les gens ont parlé au fil des ans. Peut-être que cela peut être utile:

function getServerAddress() {
    if(isset($_SERVER["SERVER_ADDR"]))
    return $_SERVER["SERVER_ADDR"];
    else {
    // Running CLI
    if(stristr(PHP_OS, 'WIN')) {
        //  Rather hacky way to handle windows servers
        exec('ipconfig /all', $catch);
        foreach($catch as $line) {
        if(eregi('IP Address', $line)) {
            // Have seen exec return "multi-line" content, so another hack.
            if(count($lineCount = split(':', $line)) == 1) {
            list($t, $ip) = split(':', $line);
            $ip = trim($ip);
            } else {
            $parts = explode('IP Address', $line);
            $parts = explode('Subnet Mask', $parts[1]);
            $parts = explode(': ', $parts[0]);
            $ip = trim($parts[1]);
            }
            if(ip2long($ip > 0)) {
            echo 'IP is '.$ip."\n";
            return $ip;
            } else
            ; // TODO: Handle this failure condition.
        }
        }
    } else {
        $ifconfig = Shell_exec('/sbin/ifconfig eth0');
        preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
        return $match[1];
    }
    }
}

Si tout le reste échoue, vous pouvez toujours exec ipconfig ou ifconfig, selon votre plate-forme, et analyser le résultat.

3
antik