Відповіді:
Як це для ip сервера:
$_SERVER['SERVER_ADDR'];
і це для порту
$_SERVER['SERVER_PORT'];
John Kнатомість відповідь
Якщо ви використовуєте PHP версії 5.3 або новішої, ви можете зробити наступне:
$host= gethostname();
$ip = gethostbyname($host);
Це добре працює, якщо ви використовуєте автономний скрипт, а не працюєте через веб-сервер.
/etc/hostsфайлі і буде швидко, хоча це може бути просто так 127.0.0.1. Якщо все-таки доведеться викликати DNS, це буде повільно, як ви говорите.
наприклад:
$_SERVER['SERVER_ADDR']
коли ви на IIS, спробуйте:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']доступний лише під IIS, коли PHP працює як модуль CGI.
Я зайшов на цю сторінку, шукаючи спосіб отримати власну ip-адресу, а не одну з віддалених до мене машин.
Це не буде працювати для машини Windows.
Але якщо хтось шукає те, що я шукав:
#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;
(Безсоромно адаптовано з Як я отримати первинний IP - адреса локальної машини на Linux і OS X? )
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
Жоден з найбільш голосованих відповідей надійно не поверне публічну адресу сервера. Як правило, $_SERVER['SERVER_ADDR']це буде правильно, але якщо ви звертаєтесь до сервера через VPN, він, швидше за все, поверне внутрішню мережеву адресу, а не загальнодоступну адресу, і навіть якщо він не знаходиться в одній мережі, деякі конфігурації будуть просто порожніми або матимуть іншу інформацію значення.
Так само існують сценарії, коли $host= gethostname(); $ip = gethostbyname($host);не повертаються правильні значення, оскільки він покладається як на DNS (або внутрішньо налаштовані, або на зовнішні записи), і на назви сервера, щоб екстраполювати IP-адресу сервера. Обидва ці кроки є потенційно несправними. Наприклад, якщо ім'я хоста сервера відформатоване як доменне ім’я (тобто HOSTNAME=yahoo.com), то (принаймні, у моїй настройці php5.4 / Centos6) gethostbynameбуде пропущено прямо до пошуку адреси Yahoo.com, а не до локального сервера.
Крім того, через те, що gethostbynameзнову потрапляє на загальнодоступні записи DNS, тестуючий сервер із неопублікованими або невірними загальнодоступними записами DNS (наприклад, ви звертаєтесь до сервера за localhostIP-адресою або якщо ви перекриваєте загальнодоступний DNS за допомогою локального hostsфайлу), Я поверну або будь-яку IP-адресу (вона просто поверне ім’я хоста), або ще гірше, вона поверне неправильну адресу, вказану в загальнодоступних записах DNS, якщо така існує, або якщо є доменна карта для домену.
Залежно від ситуації, ви можете також спробувати третій підхід, зробивши щось подібне:
$external_ip = exec('curl http://ipecho.net/plain; echo');
У цього є свої недоліки (покладається на певний сторонній сайт, і там можуть бути мережеві налаштування, які маршрутизують вихідні з'єднання через інший хост або проксі), і gethostbynameвони можуть бути повільними. Я, чесно кажучи, не впевнений, який підхід буде правильним найчастіше, але урок, який слід сприйняти, полягає в тому, що конкретні сценарії / конфігурації призведуть до неправильних результатів для всіх цих підходів ... тому, якщо можливо, перевірте, що підхід ви є використання повертає очікувані значення.
Це те, що ви можете використовувати як адаптацію вищезазначених прикладів, не турбуючись про завиток, встановлений на вашому сервері.
<?php
// create a new cURL resource
$ch = curl_init ();
// set URL and other appropriate options
curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL and pass it to the browser
$ip = curl_exec ($ch);
echo "The public ip for this server is: $ip";
// close cURL resource, and free up system resources
curl_close ($ch);
?>
Якщо ви використовуєте PHP в bash shell, ви можете використовувати:
$server_name=exec('hostname');
Тому що $_SERVER[] SERVER_ADDR, HTTP_HOSTі SERVER_NAMEне встановлені.
Я виявив, що це працює для мене: GetHostByName ("");
Запуск XAMPP v1.7.1 на Windows 7 під керуванням веб-сервера Apache. На жаль, це просто дасть IP-адресу мого шлюзу.
Щойно я створив простий сценарій, який поверне $ _SERVER ['REMOTE_ADDR'] та $ _SERVER ['SERVER_ADDR'] в IIS, тому вам не доведеться змінювати кожну змінну. Просто вставте цей текст у свій PHP-файл, який міститься на кожній сторінці.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Перевірте масив $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]не має нічого спільного з заголовками HTTP. Це заповнено серверним програмним забезпеченням, усі речі, пов’язані з HTTP, у $ _SERVER з префіксом HTTP_. php.net/manual/en/reserved.variables.server.php
Подобається це:
$_SERVER['SERVER_ADDR'];