Функция PHP getservbyport(): всё, что нужно знать
Функция PHP getservbyport() возвращает имя сетевого сервиса по номеру порта и протоколу. Синтаксис, параметры, примеры и распространённые ошибки.
Функция PHP getservbyport() преобразует числовой номер сетевого порта в удобочитаемое имя сервиса, зарегистрированное для него, — например, порт 80 становится http, а порт 443 — https. Это обратная операция по отношению к 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, поскольку допустимое имя сервиса иначе может быть ошибочно воспринято как ложное значение.
Базовый пример
Здесь мы запрашиваем 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(), когда нужно реально обратиться к сервису.