W3docs

Entendendo as Funções de Rede do PHP

Aprenda as funções de rede do PHP para resolver nomes, abrir sockets, trabalhar com endereços IP e verificar registros DNS com exemplos práticos.

A conectividade de rede está no coração da maioria das aplicações web: resolver nomes de host, abrir sockets, comunicar-se com outros servidores e validar endereços IP. O PHP possui um conjunto integrado de funções de rede que permitem fazer tudo isso sem bibliotecas externas. Este capítulo explica quais são essas funções, quando usar cada grupo e como utilizá-las corretamente com exemplos executáveis.

O que são funções de rede do PHP?

As funções de rede do PHP são funções integradas que permitem que seu script se comunique por uma rede. Com elas você pode:

  • Resolver nomes — transformar um nome de host como www.example.com em um endereço IP (e vice-versa).
  • Abrir conexões — criar um socket TCP/UDP para outro servidor e trocar bytes brutos.
  • Ler e escrever streams — enviar uma requisição e ler a resposta.
  • Trabalhar com endereços IP — converter entre strings legíveis por humanos e forma binária compactada, tanto para IPv4 quanto para IPv6.

Por fazerem parte do núcleo do PHP, nenhum pecl install ou pacote Composer é necessário — as funções abaixo estão sempre disponíveis.

Funções de DNS e pesquisa de host

Antes de se conectar a um servidor, geralmente você precisa do seu endereço IP. Essas funções lidam com a resolução de nomes.

FunçãoO que faz
gethostbyname()Retorna o endereço IPv4 para um nome de host.
gethostbyaddr()Retorna o nome de host para um endereço IP (pesquisa reversa).
gethostbynamel()Retorna uma lista de todos os endereços IPv4 para um nome de host.
checkdnsrr()Verifica se existem registros DNS (A, MX, etc.) para um host.
dns_get_record()Busca os registros DNS completos de um host.

Uma combinação comum é gethostbyname() para obter um IP e checkdnsrr() para verificar se um host realmente possui registros DNS — é exatamente isso que a questão prática abaixo aborda.

<?php

$host = "localhost";

// Resolve a hostname to its IPv4 address.
$ip = gethostbyname($host);
echo "IP for {$host}: {$ip}\n";

// Reverse lookup: IP back to a hostname.
echo "Host for {$ip}: " . gethostbyaddr($ip) . "\n";

Se um nome não puder ser resolvido, gethostbyname() retorna a string de entrada inalterada em vez de lançar um erro — sempre compare o resultado com o original antes de confiar nele.

Funções de conexão por socket

Quando você precisa de uma conexão bruta com outro servidor, abra um socket de stream. A função moderna e recomendada é stream_socket_client(); o antigo fsockopen() ainda funciona, mas a API de stream é mais flexível.

FunçãoPara que usar
stream_socket_client()Abrir uma conexão de cliente (recomendado).
stream_socket_server()Aguardar conexões entrantes (construir um servidor).
pfsockopen()Abrir um socket persistente que sobrevive entre requisições.
fsockopen()Forma legada de abrir um socket; prefira a versão stream.

Aqui está uma requisição HTTP mínima feita manualmente por meio de um socket:

<?php

$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);

if (!$fp) {
    echo "Connection failed: {$errstr} ({$errno})\n";
} else {
    $request  = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "Connection: Close\r\n\r\n";

    fwrite($fp, $request);

    while (!feof($fp)) {
        echo fgets($fp, 128); // read the response line by line
    }
    fclose($fp);
}

Isso abre uma conexão TCP na porta 80, envia uma requisição GET bruta e imprime a resposta do servidor. Para trabalho HTTP real, raramente você escreve requisições manualmente — veja file_get_contents() para leituras simples, ou use cURL / Guzzle para cabeçalhos, redirecionamentos e HTTPS.

Funções de I/O de stream

Uma vez que um socket (ou qualquer stream) esteja aberto, essas funções leem e escrevem os bytes que fluem por ele. São as mesmas funções usadas para manipulação de arquivos, porque o PHP trata sockets e arquivos como streams.

  • fgets() — ler uma linha.
  • fgetc() — ler um caractere.
  • fread() — ler um número fixo de bytes.
  • fwrite() — escrever dados no stream.
  • feof() — testar se o fim do stream foi atingido.

Funções de conversão de endereços IP

Essas funções convertem entre a forma de string com pontos/dois-pontos de um IP e sua representação binária compactada. São essenciais ao armazenar endereços de forma compacta ou compará-los.

FunçãoDireçãoFamília
inet_pton()string → binário compactadoIPv4 e IPv6
inet_ntop()binário compactado → stringIPv4 e IPv6
ip2long()string IPv4 → inteirosomente IPv4
long2ip()inteiro → string IPv4somente IPv4
<?php

$ip = "192.168.1.1";

// Pack the IPv4 string into binary, then expand it back.
$packed = inet_pton($ip);
echo "Round-trip: " . inet_ntop($packed) . "\n";

// ip2long stores an IPv4 address as a single integer (handy for databases).
$long = ip2long($ip);
echo "As integer: {$long}\n";
echo "Back to string: " . long2ip($long) . "\n";

inet_pton() / inet_ntop() funcionam tanto para IPv4 quanto para IPv6, enquanto ip2long() / long2ip() são apenas para IPv4. Prefira o par inet_* quando seu código precisar lidar com IPv6.

Validando endereços IP

Para verificar se uma string é um IP válido — por exemplo, entrada de usuário — use filter_var() em vez de uma regex escrita manualmente:

<?php

$candidates = ["192.168.0.1", "999.1.1.1", "::1"];

foreach ($candidates as $value) {
    $valid = filter_var($value, FILTER_VALIDATE_IP) !== false;
    echo $value . " => " . ($valid ? "valid" : "invalid") . "\n";
}

Isso valida IPv4 e IPv6 em uma única chamada; adicione FILTER_FLAG_IPV4 ou FILTER_FLAG_IPV6 para restringir a família.

Quando você deve usar essas funções?

  • Protocolos de baixo nível — construindo um cliente SMTP, FTP ou TCP personalizado onde você controla os bytes na rede.
  • Verificações de saúde do serviço — verificando se um host resolve (checkdnsrr()) ou se uma porta está acessível (stream_socket_client() com um timeout curto).
  • Armazenando dados de IP — compactando endereços com inet_pton() ou ip2long() para economizar espaço e habilitar consultas de intervalo.
  • Para chamadas comuns de API HTTP, prefira cURL ou uma biblioteca cliente; as funções de socket são para quando você precisa de um controle mais fino do que essas fornecem.

Conclusão

As funções de rede do PHP oferecem tudo, desde pesquisas DNS até sockets brutos e conversão de IP, tudo sem dependências externas. Lembre-se dos três grupos: resolver um host (gethostbyname(), checkdnsrr()), conectar-se a ele (stream_socket_client()) e ler/escrever o stream (fgets(), fwrite()). Para trabalho de nível mais alto, utilize cURL e Guzzle e recorra a essas funções apenas quando precisar de controle de nível mais baixo.

Prática

Prática
Quais funções são usadas no PHP para obter o IP de rede e verificar o IP de rede, respectivamente?
Quais funções são usadas no PHP para obter o IP de rede e verificar o IP de rede, respectivamente?
Was this page helpful?