PHP, как получить локальный IP-адрес системы

Мне нужно получить локальный IP-адрес компьютера, например 192. *.... Возможно ли это с PHP?

Мне нужен IP-адрес системы под управлением script, но мне не нужен внешний IP-адрес, мне нужен адрес локальной сетевой карты.

Ответ 1

Из CLI

PHP < 5.3.0

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

PHP >= 5.3.0

$localIP = getHostByName(getHostName());

Ответ 2

$_SERVER['SERVER_ADDR']

Ответ 3

Это старый пост, но получите его с помощью:

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

Например:

die( getLocalIp() );

Найденный на другом сайте, не удаляйте команду trim, потому что иначе вы получите имя компьютера.

СПЕЦИФИКАЦИИ (Специальные кавычки): Это работает, потому что PHP будет пытаться запускать все, что он между этими "специальными кавычками" (backticks), в качестве команды оболочки и возвращает итоговый результат.

gethostbyname(trim(`hostname`));

Очень похож (но гораздо эффективнее), чем делать:

$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

Ответ 4

попробуйте это (если ваш сервер Linux):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;

Ответ 5

Внешний IP-адрес по умолчанию для локальной машины можно получить следующим образом:

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

Как это устроено:

Поскольку это UDP, socket_connect не выходит в сеть. Он только назначает локальный адрес и порт сокету. Это позволяет нам получить локальный адрес.

Это решение работает без сетевого трафика, DNS или выполнения команд.

Может не работать, если нет маршрута к 8.8.8.8 (например, у вас нет подключения к интернету).

Ответ 6

Зависит от того, что вы подразумеваете под локальным:

Если по локальному вы имеете в виду адрес сервера/системы, выполняющей PHP-код, то есть еще два вопроса для обсуждения. Если PHP запускается через веб-сервер, вы можете получить адрес сервера, прочитав $_SERVER['SERVER_ADDR']. Если PHP запускается через интерфейс командной строки, вам, скорее всего, придется выполнить shell-execute ipconfig (Windows)/ifconfig (* nix) и вывести адрес grep.

Если по локальному вы имеете в виду удаленный адрес посетителя сайта, но не внешний адрес IP (поскольку вы конкретно сказали 192. *), вам не повезло. Весь смысл маршрутизации NAT заключается в том, чтобы скрыть этот адрес. Вы не можете идентифицировать локальные адреса отдельных компьютеров за IP-адресом, но есть некоторые трюки (пользовательский агент, возможно, MAC-адрес), которые могут помочь различать, если есть несколько компьютеров, получающих доступ с одного и того же IP-адреса.

Ответ 7

имя хоста (1) может указать IP-адрес: hostname --ip-address, или, как говорит человек, лучше использовать hostname --all-ip-addresses

Ответ 8

Вы можете попробовать это как обычный пользователь в CLI на хосте 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);

Вывод:

array (
  'eth0' => '192.168.1.1',
  'eth0:0' => '192.168.2.1',
  'lo' => '127.0.0.1',
  'vboxnet0' => '192.168.56.1',
)

Ответ 9

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

Я попробовал в Windows PC и его работало, а также думаю, что будет работать на Linux.

Ответ 10

Я возился с этим вопросом для php на стороне сервера (работает с терминала Linux)

Я взорвал 'ifconfig' и урезал его до IP-адреса.

Вот:

$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim('ifconfig'))[1])[1])[1])[0];

И, конечно же, измените "wlan0" на желаемое сетевое устройство.

Мой вывод:

192.168.1.5

Ответ 11

Если вы находитесь в среде dev на OS X, подключенной через Wi-Fi:

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

Ответ 12

Это очень просто и вышеприведенные ответы усложняют вещи. Просто вы можете получить как локальные, так и публичные IP-адреса с помощью этого метода.

   <?php 
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;

$localIp = gethostbyname(gethostname());
echo $localIp;

?>

Ответ 13

Это легко. Вы можете получить имя хоста с помощью этого простого кода.

$ip = getHostByName(getHostName());

Или вы также можете использовать $_SERVER['HTTP_HOST'] чтобы получить имя хоста.

Ответ 14

Попробуйте это

$localIP = gethostbyname(trim('hostname'));

Ответ 15

$_SERVER['REMOTE_ADDR']
  • PHP_SELF Возвращает имя файла текущего script с указанием пути к корню

  • SERVER_PROTOCOL Возвращает имя и ревизию запрошенного страницы протокола

  • REQUEST_METHOD Возвращает метод запроса, используемый для доступа к странице

  • DOCUMENT_ROOT Возвращает корневой каталог, под которым выполняется текущий script