PHP getservbyname 函数
最后修改于 2025 年 4 月 4 日
PHP 的 getservbyname
函数用于查找网络服务的端口号。它将服务名称转换为相应的端口号。
基本定义
getservbyname
返回与 Internet 服务和协议相关联的端口号。它会检查系统的服务数据库(/etc/services)。
语法:getservbyname(string $service, string $protocol): int|false
。成功时返回端口号,失败时返回 false。常用协议:tcp,udp。
查找 HTTP 端口
此示例演示了如何查找 HTTP 服务的标准端口。
http_port.php
<?php declare(strict_types=1); $http_port = getservbyname('http', 'tcp'); if ($http_port !== false) { echo "HTTP service runs on port: $http_port"; } else { echo "HTTP service not found"; }
这会检查 TCP 上 HTTP 的标准端口。预期结果是 80。如果系统中找不到该服务,该函数将返回 false。
检查 FTP 端口
此示例展示了如何验证标准的 FTP 控制端口号。
ftp_port.php
<?php declare(strict_types=1); $ftp_port = getservbyname('ftp', 'tcp'); if ($ftp_port !== false) { echo "FTP control port is: $ftp_port"; } else { echo "FTP service not found"; }
FTP 通常使用端口 21 进行控制连接。这会验证标准的配置。协议必须与服务的实际传输协议匹配。
查找多个服务
此示例在一项操作中检查多个常用服务的端口。
multi_service.php
<?php declare(strict_types=1); $services = [ ['ssh', 'tcp'], ['smtp', 'tcp'], ['domain', 'udp'] ]; foreach ($services as $service) { $port = getservbyname($service[0], $service[1]); echo "{$service[0]} ({$service[1]}): " . ($port ?: 'Not found') . "\n"; }
这演示了使用不同协议检查多个服务。SSH 使用 TCP 端口 22,SMTP 使用 TCP 端口 25,DNS(域名)通常使用 UDP 端口 53。
验证自定义服务端口
此示例展示了如何验证自定义服务是否存在于系统中。
custom_service.php
<?php declare(strict_types=1); $service = 'myapp'; $protocol = 'tcp'; $port = getservbyname($service, $protocol); if ($port !== false) { echo "$service runs on port $port"; } else { echo "$service is not a registered service"; }
这会检查“myapp”是否已在系统服务数据库中注册。要使其正常工作,必须在 /etc/services 或等效的系统文件中定义该服务。
构建服务端口查找工具
此示例创建了一个简单的命令行工具,用于服务端口查找。
port_lookup.php
<?php declare(strict_types=1); if ($argc != 3) { echo "Usage: php port_lookup.php <service> <protocol>\n"; exit(1); } $service = $argv[1]; $protocol = $argv[2]; $port = getservbyname($service, $protocol); if ($port !== false) { echo "$service/$protocol: port $port\n"; } else { echo "Service $service with protocol $protocol not found\n"; }
该脚本接受服务名称和协议作为命令行参数。它提供了一种从终端或脚本查询服务端口的实用方法。
最佳实践
- 错误处理:始终检查 false 返回值
- 协议匹配:使用正确的协议(tcp/udp)
- 区分大小写:服务名称区分大小写
- 系统差异:结果可能因系统而异
来源
本教程通过各种场景下的实际示例,介绍了 PHP getservbyname
函数在网络服务端口查找方面的应用。
作者
列出 所有 PHP 网络函数。