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 网络函数。