W3docs

Функция PHP getservbyport(): всё, что нужно знать

Функция PHP getservbyport() возвращает имя сетевого сервиса по номеру порта и протоколу. Синтаксис, параметры, примеры и распространённые ошибки.

Функция PHP getservbyport() преобразует числовой номер сетевого порта в удобочитаемое имя сервиса, зарегистрированное для него, — например, порт 80 становится http, а порт 443https. Это обратная операция по отношению к getservbyname(), которая работает в противоположном направлении (имя → порт). На этой странице описаны синтаксис, источник данных, распространённые подводные камни и примеры использования функции в реальном коде.

Что делает getservbyport()

getservbyport() выполняет поиск общеизвестного имени сервиса, которое операционная система связывает с заданной парой порт/протокол. Функция не открывает сокет, не обращается к серверу и ничего не сканирует — она просто читает локальную таблицу поиска, поддерживаемую ОС:

  • На Linux и macOS эта таблица представляет собой файл /etc/services.
  • На Windows — %WINDIR%\System32\drivers\etc\services.

Поскольку ответ берётся из статического файла, функция работает быстро и не требует подключения к сети, однако знает только о портах, перечисленных в этом файле. Для нестандартного порта приложения (например, 8080, на котором работает ваш dev-сервер) функция обычно вернёт false, так как для него не зарегистрировано имя сервиса.

Синтаксис

getservbyport(int $port, string $protocol): string|false

Параметры

  • $port — номер порта для поиска в виде целого числа (например 80, 443, 22).
  • $protocol — имя протокола: "tcp" или "udp". Вопреки тому, что предполагают некоторые источники, этот аргумент обязателен, а не опционален. Один и тот же номер порта может соответствовать разным именам сервисов в зависимости от протокола.

Возвращаемое значение

  • Имя сервиса в виде строки (например "http"), если совпадение найдено.
  • false, если пара порт/протокол не зарегистрирована. Всегда проверяйте результат строгим сравнением === false, поскольку допустимое имя сервиса иначе может быть ошибочно воспринято как ложное значение.

Базовый пример

php— editable, runs on the server

Здесь мы запрашиваем TCP-сервис на порту 80. На стандартной системе поиск выполняется успешно и выводит:

The service name for port number 80 and protocol name tcp is http

Благодаря сравнению с === false незарегистрированный порт отображается корректно, без запутанных сообщений.

Поиск нескольких портов

Если у вас есть список портов — например, для подписи записей в журнале брандмауэра — переберите их в цикле и разрешите каждый:

<?php

$ports = [22, 25, 53, 443, 49152];

foreach ($ports as $port) {
  $service = getservbyport($port, "tcp");
  echo $service === false
    ? "Port $port/tcp: unknown service\n"
    : "Port $port/tcp: $service\n";
}

Типичный вывод (порт 49152 находится в диапазоне частных/динамических портов и не является зарегистрированным сервисом, поэтому попадает в ветку «unknown»):

Port 22/tcp: ssh
Port 25/tcp: smtp
Port 53/tcp: domain
Port 443/tcp: https
Port 49152/tcp: unknown service

Когда использовать (и когда не стоит)

Используйте getservbyport(), когда нужна понятная метка для известного порта: при отображении лог-файлов, построении сетевой панели мониторинга или проверке конфигурации. Эта функция не является способом проверить, открыт ли порт или используется ли он — она никогда не обращается к сети. Для проверки соединения вам нужна настоящая сокетная функция, например fsockopen().

Распространённые ошибки

  • Пропуск аргумента с протоколом. Вызов getservbyport(80) вызовет ошибку; всегда передавайте "tcp" или "udp".
  • Ожидание разрешения нестандартных портов. Порты, отсутствующие в /etc/services, возвращают false, даже если на них активно слушает сервер.
  • Нестрогое сравнение. Используйте === false, а не == false или !$result, чтобы пограничные случаи с пустой строкой не были интерпретированы неверно.

Связанные функции

  • getservbyname() — обратный поиск: имя сервиса → номер порта.
  • getprotobyname() — преобразует имя протокола (например "tcp") в его номер.
  • gethostbyname() — преобразует имя хоста в IPv4-адрес.
  • fsockopen() — открывает реальное сетевое соединение с хостом и портом.

Заключение

getservbyport() — небольшая, но удобная вспомогательная функция, которая переводит пару порт/протокол в зарегистрированное имя сервиса, читая системный файл сервисов. Помните, что аргумент с протоколом обязателен, неизвестные порты возвращают false, а функция выполняет локальный поиск без каких-либо сетевых обращений. Используйте её вместе с getservbyname() для обратного преобразования и с fsockopen(), когда нужно реально обратиться к сервису.

Практика

Практика
Что делает функция getservbyport() в PHP?
Что делает функция getservbyport() в PHP?
Was this page helpful?