Відповіді:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
не повертають доменне ім’я сайтів.
Це стара публікація, але отримайте її з цим:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Наприклад:
die( getLocalIp() );
Знайшов його на іншому сайті, не видаляйте команду trim, бо інакше ви отримаєте ім'я комп'ютерів.
ЗВЕРНЕННЯ (Спеціальні лапки): Це працює, тому що 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) і видалити адресу.
Якщо під місцевими мовами ви маєте на увазі віддалену адресу відвідувача веб-сайту, але не їх зовнішню 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'));