Função PHP getservbyname(): Tudo o Que Você Precisa Saber
Como desenvolvedor PHP, você pode precisar obter o número de porta associado a um determinado nome de serviço. A função getservbyname() resolve isso.
Os serviços de rede são identificados por nomes conhecidos como http, ftp ou smtp, mas o sistema operacional roteia o tráfego pelo número de porta (80, 21, 25, e assim por diante). A função getservbyname() do PHP consulta esse número de porta para você, lendo o mesmo banco de dados de serviços que o restante do sistema utiliza. Esta página explica a sintaxe, o que é esse banco de dados, casos de uso comuns e as armadilhas a observar.
Sintaxe
getservbyname(string $service, string $protocol): int|falseA função recebe dois parâmetros obrigatórios:
$service— o nome do serviço de Internet, por exemplo"http","ssh"ou"smtp".$protocol— o protocolo de transporte, podendo ser"tcp"ou"udp". Ao contrário do que muita documentação antiga sugere, esse argumento não é opcional; você deve passá-lo.
Ela retorna o número da porta como um integer em caso de sucesso, ou false se o par serviço/protocolo não for encontrado. Como false e uma porta válida podem ambos parecer "falsy", sempre compare com o operador estrito === ao verificar falhas.
De onde vêm os dados
getservbyname() não se conecta a nada nem adivinha. Ela lê uma tabela de consulta local:
- No Linux e macOS, esse é o arquivo
/etc/services. - No Windows, é
%SystemRoot%\system32\drivers\etc\services.
Se um serviço estiver ausente desse arquivo, a consulta falhará mesmo que o serviço "obviamente" exista. O resultado é, portanto, uma propriedade da máquina que executa o script, não uma constante universal.
Um exemplo básico
A verificação === false importa: ela separa claramente uma falha real de um resultado legítimo como a porta 0 (que seria falsy em uma comparação solta com ==).
Consultando vários serviços
Na prática, você frequentemente resolve um lote de nomes de uma vez — por exemplo, para construir um relatório de firewall ou validar uma configuração:
<?php
$services = ["http", "https", "ftp", "smtp", "ssh"];
foreach ($services as $name) {
$port = getservbyname($name, "tcp");
echo $port === false
? "{$name}: not found\n"
: "{$name}: {$port}\n";
}
/*
Output:
http: 80
https: 443
ftp: 21
smtp: 25
ssh: 22
*/TCP vs UDP
O mesmo nome de serviço pode ser resolvido para entradas diferentes por protocolo, e alguns serviços existem apenas para um deles. Sempre passe o protocolo com o qual você realmente se preocupa:
<?php
var_dump(getservbyname("domain", "tcp")); // int(53) — DNS over TCP
var_dump(getservbyname("domain", "udp")); // int(53) — DNS over UDP
var_dump(getservbyname("ntp", "udp")); // int(123)
var_dump(getservbyname("madeup", "tcp")); // bool(false) — unknown serviceQuando eu usaria isso?
- Construindo clientes de rede dinamicamente. Resolva um nome de serviço para uma porta antes de abrir um socket com
fsockopen()oupfsockopen(), para que seu código leia"smtp"em vez de um número mágico25. - Validando configuração. Confirme que um nome de serviço de um arquivo de configuração é realmente conhecido pelo host antes de usá-lo.
- Relatórios / ferramentas. Traduza nomes de serviço legíveis por humanos em portas para logs, dashboards ou regras de firewall.
Funções relacionadas
getservbyport()— o inverso: dado um número de porta e protocolo, retorna o nome do serviço.getprotobyname()— consulta um número de protocolo (ex.:tcp→6) pelo seu nome.
Armadilhas comuns
- Ambos os argumentos são obrigatórios. Omitir
$protocolgera um erro; não há padrão implícito. - Somente comparação estrita. Use
=== falsepara detectar falhas e não interpretar erroneamente a porta0ou um caso extremo de string numérica. - Resultados dependentes do host. A resposta vem do banco de dados de serviços local; um nome desconhecido em uma máquina pode ser resolvido em outra.
- É offline. Sem DNS, sem rede — puramente uma consulta à tabela local, portanto é rápida e segura para chamar com frequência.
Resumo
getservbyname() mapeia um nome de serviço e protocolo para um número de porta usando o banco de dados de serviços do sistema operacional, retornando uma porta inteira ou false quando o par é desconhecido. Use-a junto com getservbyport() para a direção inversa e com fsockopen() quando precisar transformar essa porta em uma conexão real.