W3docs

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|false

A 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

php— editable, runs on the server

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 service

Quando eu usaria isso?

  • Construindo clientes de rede dinamicamente. Resolva um nome de serviço para uma porta antes de abrir um socket com fsockopen() ou pfsockopen(), para que seu código leia "smtp" em vez de um número mágico 25.
  • 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.: tcp6) pelo seu nome.

Armadilhas comuns

  • Ambos os argumentos são obrigatórios. Omitir $protocol gera um erro; não há padrão implícito.
  • Somente comparação estrita. Use === false para detectar falhas e não interpretar erroneamente a porta 0 ou 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.

Prática

Prática
Qual é o propósito da função getservbyname() em PHP?
Qual é o propósito da função getservbyname() em PHP?
Was this page helpful?