PHP批量对TCP服务端指定多个IP非阻塞检查在线状态
更新:2025-03-09 18:58:57
人气:109
来源:本站原创
A+
这段 PHP 代码定义了一个名为isTcpServerOnline的函数,用于检查指定主机和端口的 TCP 服务器是否在线。函数通过创建一个 TCP 套接字,尝试连接到指定的主机和端口,并根据连接结果返回布尔值。最后给出了一个使用该函数的示例。
为了能够批量判断多个指定 IP 和端口的 TCP 服务器是否在线,并且提高效率,可以使用非阻塞 I/O 结合 stream_select 函数来实现。stream_select 允许同时监视多个套接字的状态,而不会阻塞程序的执行。
function isTcpServersOnline($hostsPorts, $timeout = 3) {
$sockets = [];
$hostPortToSocket = [];
$results = [];
// 创建套接字并尝试非阻塞连接
foreach ($hostsPorts as $index => list($host, $port)) {
$socket = @stream_socket_client("tcp://$host:$port", $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);
if ($socket) {
$sockets[] = $socket;
$hostPortToSocket[(string)$socket] = $index;
stream_set_blocking($socket, false);
} else {
$results[$index] = false;
}
}
$write = $sockets;
$except = $sockets;
// 使用 stream_select 等待连接结果
@stream_select($null, $write, $except, $timeout);
foreach ($sockets as $socket) {
$index = $hostPortToSocket[(string)$socket];
if (in_array($socket, $write)) {
// 检查连接是否成功
$error = stream_socket_get_name($socket, true);
$results[$index] = ($error !== false);
} elseif (in_array($socket, $except)) {
$results[$index] = false;
} else {
$results[$index] = false;
}
fclose($socket);
}
// 对结果进行排序,确保和输入的顺序一致
ksort($results);
return $results;
}
// 示例使用
$hostsPorts = [
['192.168.177.1', 65432],
['192.168.177.2', 65432],
['192.168.177.3', 65432]
];
$onlineStatus = isTcpServersOnline($hostsPorts);//李雷博客 https://www.mdaima.com
foreach ($onlineStatus as $index => $status) {
list($host, $port) = $hostsPorts[$index];
$statusText = $status ? '在线' : '不在线';
echo "TCP服务端 {$host}:{$port} {$statusText}。<br />";
}
推荐的文章
随手记
- ● 自制(IP或域名)可信任的SSL证书,适用360、chrome等浏览器
- ● windows系统下php无法使用curl怎么办?
- ● 绿联UGREENKVM切换器(分屏器)快捷键丢失解决办法
- ● 统信UOS开机指定网址全屏启动自带浏览器以及屏蔽ALT+F4关闭
- ● xshellSSH连接Linux服务器防止超时退出
- ● php8开启OpenSSL扩展库报错disabledinstallext
- ● 统信系统linux安装php时的报错libxml-2.0>=2.7.6
- ● tidb关闭sql_mode=ONLY_FULL_GROUP_BY模式
- ● windows10如何开机自动运行bat文件
- ● Win10Mysql8初始密码丢失,初始化又不显示密码
PHP经验分享
- ● python实现TCP服务端持续接收关机、重启指令并输出结果【系列三】
- ● PHP给TCP服务端发送指令【系列二】
- ● PHP判断TCP服务端是否在线【系列一】
- ● PHP判断远程文件是否存在
- ● LINUX下用PHP获取CPU型号、内存占用、硬盘占用等信息代码
- ● PHP代码用UDP方式远程唤醒电脑让计算机开机
- ● apache下php生成验证码图片不能显示
- ● PHP使用AES加密解密示例(无偏移)
- ● Pluginmysql_native_passwordreported:''mysql_native_password'isdeprecate问题
- ● PHP实现计算CRC-16/MODBUS校验位