Ни один из ответов, набравших наибольшее количество голосов, не будет надежно возвращать публичный адрес сервера.Как правило, $_SERVER['SERVER_ADDR']
будет правильным, но если вы обращаетесь к серверу через VPN, он, скорее всего, вернет адрес внутренней сети, а не публичный адрес, и даже если не в той же сети, некоторые конфигурации будут просто пустыми или будут иметькакое-то другое указанное значение.
Аналогичным образом, существуют сценарии, в которых $host= gethostname(); $ip = gethostbyname($host);
не будет возвращать правильные значения, так как он полагается как на DNS (либо на внутреннюю настройку, либо на внешние записи), либо на настройки имени хоста сервера для экстраполяции IP-адреса сервера.Оба эти шага потенциально неисправны.Например, если имя хоста сервера отформатировано как доменное имя (то есть HOSTNAME=yahoo.com
), то (по крайней мере, в моей настройке php5.4 / Centos6) gethostbyname
сразу перейдет к поиску адреса Yahoo.com, а не локальногосервера.
Кроме того, поскольку gethostbyname
использует общедоступные записи DNS, тестовый сервер с неопубликованными или неверными общедоступными записями DNS (например, вы обращаетесь к серверу по localhost
или IP-адресу, или есливы переопределяете общедоступный DNS, используя свой локальный файл hosts
), тогда вы получите либо нет IP-адреса (он просто вернет имя хоста), либо, что еще хуже, он вернет неправильный адрес, указанный в общедоступных записях DNS, если таковой существуетили если есть подстановочный знак для домена.
В зависимости от ситуации, вы также можете попробовать третий подход, выполнив что-то вроде этого:
$external_ip = exec('curl http://ipecho.net/plain; echo');
Это имеет свои недостатки (зависит отопределенный сторонний сайт, и могут быть сетевые настройки, которые направляют исходящие соединения через другой хост или прокси) икак gethostbyname
это может быть медленным.Честно говоря, я не уверен, какой подход будет наиболее правильным, но урок, который следует принять близко к сердцу, заключается в том, что конкретные сценарии / конфигурации приведут к неверным результатам для всех этих подходов ... поэтому, если возможно, убедитесь, что подход подходит вамИспользование возвращает ожидаемые значения.