欢迎您来到,李雷博客 | PHP博客        登录  |  注册

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

 

推荐的文章
# 发表我的评论
  /     /  
# 最近评论
暂时还没有评论,要不要说点什么?
  Ads by Google
  联系博主
Hello,本博客系统采用PHP和MySql开发,程序开发完全是因为个人爱好,是自己纯手写PHP源代码,未采用任何PHP框架!
QQ:858353007   微信号:lileihot123
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
加我微信
移动端访问
 
 
Copyright © 2014- 2025 www.mdaima.com All Rights Reserved.
李雷博客,专注PHP经验、PHP教程及PHP源代码开源下载分享的PHP博客!   ICP备案号:京ICP备10202169号-4