Мне нужно получить локальный IP-адрес компьютера, например 192. * .... Возможно ли это с помощью PHP?
Мне нужен IP-адрес системы, в которой запущен скрипт, но мне не нужен внешний IP, мне нужен его адрес локальной сетевой карты.
Ответы:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
не возвращают доменное имя сайта.
Это старый пост, но получите его вот так:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Например:
die( getLocalIp() );
Нашли его на другом сайте, не удаляйте команду обрезки, иначе вы получите имя компьютера.
НАЗАД (специальные кавычки): это работает, потому что PHP будет пытаться выполнить все, что находится между этими «специальными кавычками» (обратными кавычками), как команду оболочки и возвращает полученный результат.
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
gethostbyname
возврата IP-адреса обратной петли (например, 127.0.0.1) для хост-машины.
попробуйте это (если ваш сервер Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
что это подходящий интерфейс.
wlan0
вместо eth0
и заменить 'inet addr:'
на 'inet adr:'
, возможно, из-за языкового стандарта, используемого в моей системе (fr_FR). Помимо этого, этот ответ был тем решением, которое я искал. Спасибо!
'inet adr:'
работал в моем терминале (французский язык), но в сценарии PHP 'inet addr:'
было правильное значение (английский язык, я думаю).
Внешний 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
(например, у вас нет подключения к Интернету).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
модуль должен быть установлен и включен на PHP.
Зависит от того, что вы подразумеваете под местным:
Если под локальным вы подразумеваете адрес сервера / системы, на которой выполняется PHP-код, то есть еще два пути для обсуждения. Если PHP запускается через веб-сервер, вы можете получить адрес сервера, прочитав $_SERVER['SERVER_ADDR']
. Если PHP запускается через интерфейс командной строки, вам, вероятно, придется выполнить оболочку ipconfig
(Windows) / ifconfig
(* nix) и найти адрес с помощью grep.
Если под локальным вы подразумеваете удаленный адрес посетителя веб-сайта, но не его внешний IP-адрес (поскольку вы специально указали 192. *), то вам не повезло. Весь смысл маршрутизации NAT - скрыть этот адрес. Вы не можете определить локальные адреса отдельных компьютеров за IP-адресом, но есть некоторые уловки (пользовательский агент, возможно, MAC-адрес), которые могут помочь различить, есть ли несколько компьютеров, осуществляющих доступ с одного и того же IP-адреса.
Вы можете попробовать это как обычный пользователь в 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',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
Я понял это. Я добавил этот код в файл php,
split()
функция УСТАРЕЛА с PHP 5.3.0. так что предлагаем использовать explode()
вместо этого
$localIP = gethostbyname(trim(exec("hostname")));
Я пробовал на ПК с Windows, и он работал, а также думаю, что он будет работать на Linux.
Это очень просто, и приведенные выше ответы усложняют ситуацию. Просто с помощью этого метода вы можете получить как локальные, так и общедоступные IP-адреса.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Это просто. Вы можете получить имя хоста с помощью этого простого кода.
$ip = getHostByName(getHostName());
Или вы также можете использовать $_SERVER['HTTP_HOST']
для получения имени хоста.
Я возился с этим вопросом для 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
$_SERVER['REMOTE_ADDR']
PHP_SELF
Возвращает имя файла текущего скрипта с путем относительно корня
SERVER_PROTOCOL
Возвращает имя и версию протокола запрошенной страницы.
REQUEST_METHOD
Возвращает метод запроса, используемый для доступа к странице
DOCUMENT_ROOT
Возвращает корневой каталог, в котором выполняется текущий скрипт.
Попробуй это
$localIP = gethostbyname(trim('hostname'));