开发者

How do I find my server's IP address in PHP(CLI)

开发者 https://www.devze.com 2022-12-13 05:48 出处:网络
Aside from the obvious (localhost, 127.0.0.1) does PHP (command line interface!) have a mechanism for discovering the IP of the computer the script is running on?

Aside from the obvious (localhost, 127.0.0.1) does PHP (command line interface!) have a mechanism for discovering the IP of the computer the script is running on?

$_SERVER[*] will not work as this is not a Web app - this is a command line sc开发者_开发知识库ript.

TIA


You can get the hostname by using gethostname


try this it should return the ip address of the server

$host= gethostname();
$ip = gethostbyname($host);


If you are working with PHP < 5.3, this may help (on *NIX based systems atleast):

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

Or, if you don't anticipate doing it often, then perhaps this would work (just don't abuse it):

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


I know this is a fairly old question, but there doesn't seem to be a definitive answer (in as much as one is possible.) I've had a need to determine this value, both on *NIX boxes and on Win X boxes. Also from a CLI executed script as well as a non-CLI script. The following function is the best I've come up with, which borrows on different concepts people have spoke of over the years. Maybe it can be of some use:

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];
    }
    }
}


If all else fails, you could always exec ipconfig or ifconfig, depending on your platform, and parse the result.


If you want to find local ip v4 and not WSL address.

Thanks https://stackoverflow.com/users/272555/impressthenet-web-developer for the https://stackoverflow.com/a/6256719/15610724
I rewrote the code for Windows 10 and php 7.4:

function getServerAddrAndName() {
  $serverName = getHostName();
  $addr = 'unknown';

  if (stristr(PHP_OS, 'WIN')) {
    // WIN 10 checked
    $lines = [];
    exec('ipconfig', $lines);
    // print_r($lines);
    $inWsl = FALSE;
    foreach($lines as $i => $line) {
      if ($line && stripos($line, '  ') !== 0) {
        // header-information
        $inWsl = stripos($line, '(WSL)');
        continue;
      }
      if (!$line || $inWsl) {
        // information is null or from WSL connect
        continue;
      }
      if ((stripos($line,'IP Address') || stripos($line, 'IPv4 Address')) && stripos($line,':')) {
        [, $ip] = explode(':', $line);
        $matches = [];
        $reg = '/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/';
        if (preg_match($reg, $ip, $matches)) {
          [$ip] = $matches;
          if (filter_var($ip, FILTER_VALIDATE_IP)) {
            $addr = $ip;
            break;
          }
        }
      }
    }
  } else {
    // Ubuntu 20.04 checked
    $addr = shell_exec("ip addr show eth0 | grep \"inet\b\" | awk '{print $2}' | cut -d/ -f1");
  }

  return ['serverAddr' => $addr, 'serverName' => $serverName];
}


$ip = file_get_contents('http://icanhazip.com/');

echo $ip;

0

精彩评论

暂无评论...
验证码 换一张
取 消