You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于ReactPHP实现两台服务器互通并搭建可操控的命令控制台

ReactPHP多节点通信与管理控制台实现指南

针对你提到的1<->2<->3连接逻辑,核心是拆分三个角色的职责,所有逻辑统一挂载到同一个ReactPHP事件循环实例上即可实现:


核心逻辑实现步骤

  • 第一步:搭建中转节点(架构中的中间服务)
    同时在同一个事件循环下启动两个服务:
    1. 内网Socket长连接服务:用来和所有被控服务器保持持久连接,每个新的被控节点接入时,将连接实例存入带唯一标识的连接池,方便后续指令路由。基础实现示例:
    $loop = React\EventLoop\Loop::get();
    // 被控端接入的Socket服务
    $socketServer = new React\Socket\SocketServer('0.0.0.0:9000', [], $loop);
    $nodePool = [];
    $socketServer->on('connection', function (React\Socket\ConnectionInterface $conn) use (&$nodePool) {
        $nodeId = uniqid('node_');
        $nodePool[$nodeId] = $conn;
        // 监听被控端返回的执行结果
        $conn->on('data', function ($data) use ($nodeId) {
            // 可将执行结果存入缓存或者直接推送给管理端
        });
        $conn->on('close', function () use ($nodeId, &$nodePool) {
            unset($nodePool[$nodeId]);
        });
    });
    // 管理端接入的HTTP服务
    $httpServer = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) use (&$nodePool) {
        $queryParams = $request->getQueryParams();
        $targetNodeId = $queryParams['node_id'] ?? '';
        $command = $queryParams['cmd'] ?? '';
        if (isset($nodePool[$targetNodeId]) && $command) {
            $nodePool[$targetNodeId]->write($command);
            return React\Http\Message\Response::plaintext("指令已下发");
        }
        return React\Http\Message\Response::plaintext("参数错误")->withStatus(400);
    });
    $httpSocket = new React\Socket\SocketServer('0.0.0.0:8000', [], $loop);
    $httpServer->listen($httpSocket);
    $loop->run();
    
  • 第二步:搭建被控节点客户端
    在需要被管理的服务器上启动Socket客户端,主动连接到中转节点的9000端口,保持长连接,收到指令后执行再回传结果:
    $loop = React\EventLoop\Loop::get();
    $connector = new React\Socket\Connector($loop);
    $connector->connect('中转节点IP:9000')->then(function (React\Socket\ConnectionInterface $conn) {
        $conn->on('data', function ($data) use ($conn) {
            // 执行收到的指令,可替换为ReactPHP的Process组件实现异步非阻塞执行
            $result = shell_exec($data);
            $conn->write($result);
        });
    });
    $loop->run();
    
  • 第三步:实现控制台实时观测能力
    如果需要实时查看执行结果,可以把HTTP服务替换为WebSocket服务,管理端通过WebSocket连接中转节点,中转节点收到被控端的执行结果后直接推送给管理端,比轮询效率高很多。

学习方向建议

  • 先吃透ReactPHP三个核心基础:事件循环、Stream流、Promise异步处理,这三个是所有上层逻辑的基础,不要一上来就用复杂的封装库,先把单服务通信的基础例子跑通。
  • 先实现单台中转+单台被控的1对1通信,再扩展多被控节点的连接池管理,最后加管理端的指令下发和结果推送,一步步迭代不要跳步。
  • 你卡住的1<->2<->3连接逻辑核心注意点:所有服务、连接都必须挂载到同一个事件循环实例上,不要开多个独立的事件循环,否则各部分逻辑完全无法联动。

你上传的架构示意图参考:
架构示意图

内容的提问来源于stack exchange,提问作者Maximus Light

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:06:03