ZetCode

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";
}

该脚本接受服务名称和协议作为命令行参数。它提供了一种从终端或脚本查询服务端口的实用方法。

最佳实践

来源

PHP getservbyname 文档

本教程通过各种场景下的实际示例,介绍了 PHP getservbyname 函数在网络服务端口查找方面的应用。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年起撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP 网络函数