Respostas:
Assim para o ip do servidor:
$_SERVER['SERVER_ADDR'];
e isso para o porto
$_SERVER['SERVER_PORT'];
John K
vez disso, use a resposta por
Se estiver usando o PHP versão 5.3 ou superior, você pode fazer o seguinte:
$host= gethostname();
$ip = gethostbyname($host);
Isso funciona bem quando você está executando um script autônomo, não por meio do servidor da web.
/etc/hosts
arquivo e será rápido - embora possa apenas ser 127.0.0.1
. Se for necessário chamar DNS, será lento como você disse.
por exemplo:
$_SERVER['SERVER_ADDR']
quando estiver no IIS, tente:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
só está disponível no IIS quando o PHP está sendo executado como um módulo CGI.
Eu vim para esta página procurando uma maneira de obter meu próprio endereço IP, não o da máquina remota conectada a mim.
Isso não funcionará para uma máquina Windows.
Mas caso alguém procure o que procuro:
#! /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;
(Desavergonhadamente adaptado de Como obter o endereço IP principal da máquina local no Linux e 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\.'
Nenhuma das respostas mais votadas retornará de forma confiável o endereço público do servidor. Geralmente $_SERVER['SERVER_ADDR']
estará correto, mas se você estiver acessando o servidor através de uma VPN, ele provavelmente retornará o endereço da rede interna em vez de um endereço público e, mesmo quando não estiverem na mesma rede, algumas configurações estarão simplesmente em branco ou terão algum outro especificado valor.
Da mesma forma, existem cenários em $host= gethostname(); $ip = gethostbyname($host);
que não retornará os valores corretos porque está contando com o DNS (configurado internamente ou registros externos) e as configurações de nome de host do servidor para extrapolar o endereço IP do servidor. Ambas as etapas são potencialmente falhas. Por exemplo, se o nome do host do servidor estiver formatado como um nome de domínio (ou seja HOSTNAME=yahoo.com
, pelo menos na minha configuração php5.4 / Centos6) gethostbyname
irá pular direto para encontrar o endereço do Yahoo.com ao invés do servidor local.
Além disso, como gethostbyname
recorre a registros DNS públicos, um servidor de teste com registros DNS públicos não publicados ou incorretos (por exemplo, você está acessando o servidor por meio de localhost
um endereço IP ou se estiver substituindo o DNS público usando seu hosts
arquivo local ), então você ' Não receberei nenhum endereço IP (apenas retornará o nome do host) ou, pior ainda, retornará o endereço errado especificado nos registros DNS públicos, se houver um ou se houver um caractere curinga para o domínio.
Dependendo da situação, você também pode tentar uma terceira abordagem fazendo algo assim:
$external_ip = exec('curl http://ipecho.net/plain; echo');
Isso tem suas próprias falhas (depende de um site de terceiros específico e pode haver configurações de rede que roteiam conexões de saída por meio de um host ou proxy diferente) e gethostbyname
pode ser lento. Sinceramente, não tenho certeza de qual abordagem será a correta com mais frequência, mas a lição a ser levada a sério é que cenários / configurações específicos resultarão em saídas incorretas para todas essas abordagens ... portanto, se possível, verifique se a abordagem que você está using está retornando os valores que você espera.
Isso é o que você pode usar como uma adaptação dos exemplos acima sem se preocupar com o curl instalado em seu servidor.
<?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);
?>
Se você estiver usando PHP no shell bash, poderá usar:
$server_name=exec('hostname');
Porque $_SERVER[] SERVER_ADDR
, HTTP_HOST
e SERVER_NAME
não estão definidos.
Descobri que isso funcionou para mim: GetHostByName ("");
Executando o XAMPP v1.7.1 no Windows 7 executando o servidor da web Apache. Infelizmente, apenas forneceu o endereço IP do meu gateway.
Acabei de criar um script simples que trará de volta $ _SERVER ['REMOTE_ADDR'] e $ _SERVER ['SERVER_ADDR'] no IIS para que você não precise alterar todas as variáveis. Basta colar esse texto em seu arquivo php que está incluído em todas as páginas.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Verifique a matriz $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
não tem nada a ver com cabeçalhos HTTP. Isso é preenchido pelo software do servidor, todas as coisas relacionadas a HTTP em $ _SERVER são prefixadas com HTTP_. php.net/manual/en/reserved.variables.server.php
Como isso:
$_SERVER['SERVER_ADDR'];