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

如何实现ReactPHP客户端断开后的自动重连?

嘿,我帮你搞定ReactPHP客户端自动重连的问题!你的核心问题是当前代码只发起了一次连接请求,完全没处理断开后的重试逻辑——ReactPHP的Connector默认不会自动重连,得我们手动实现这个循环重试的逻辑。

下面是修复后的完整代码,我会一步步给你拆解关键部分:

ReactPHP 自动重连客户端实现
<?php

$this->loop = \React\EventLoop\Factory::create();
$host = config('app.reactphp_receiver_host');
$port = config('app.reactphp_receiver_port');
$this->connector = new \React\Socket\Connector($this->loop);

// 封装可重复调用的重连逻辑函数
$connectWithReconnect = function () use ($host, $port, &$connectWithReconnect, $loop, $connector) {
    $connector->connect(sprintf('%s:%s', $host, $port))
        ->then(
            // 连接成功后的处理
            function (\React\Socket\ConnectionInterface $connection) use ($loop, $connectWithReconnect) {
                echo "✅ 成功连接到服务器 {$host}:{$port}\n";

                // 这里替换成你的业务数据处理逻辑
                $connection->on('data', function ($data) {
                    echo "📥 收到数据: {$data}\n";
                });

                // 连接正常断开时触发重连
                $connection->on('close', function () use ($loop, $connectWithReconnect) {
                    echo "❌ 连接已断开,5秒后尝试重连...\n";
                    $loop->addTimer(5, $connectWithReconnect);
                });

                // 连接出错时触发重连
                $connection->on('error', function (\Exception $e) use ($loop, $connectWithReconnect) {
                    echo "⚠️ 连接出错: {$e->getMessage()},5秒后尝试重连...\n";
                    $loop->addTimer(5, $connectWithReconnect);
                });
            },
            // 首次连接失败的处理
            function (\Exception $e) use ($loop, $connectWithReconnect) {
                echo "❌ 初始连接失败: {$e->getMessage()},5秒后尝试重连...\n";
                $loop->addTimer(5, $connectWithReconnect);
            }
        );
};

// 发起第一次连接
$connectWithReconnect();

// 启动ReactPHP事件循环(必须调用,否则异步逻辑不会执行)
$this->loop->run();

关键逻辑说明

  • 可复用的重连函数:用递归引用的方式定义$connectWithReconnect,让它可以在连接断开/失败后自己调用自己,实现循环重试
  • 覆盖所有断开场景:同时监听close(正常断开)和error(异常错误)事件,确保任何连接中断的情况都会触发重连
  • 添加重试延迟:用addTimer设置5秒延迟,避免短时间内频繁重试给服务器造成压力,你可以根据业务需求调整这个时间,甚至实现指数退避(比如第一次等5秒,第二次10秒,第三次20秒,直到上限)
  • 业务逻辑占位:data事件的处理部分可以替换成你实际的API对接逻辑,比如解析响应、处理业务数据等

额外注意事项

  • 如果你的业务需要维护会话状态,重连前记得清理或重置之前的会话数据
  • 可以根据需求添加重试次数上限,避免无限重试(比如连续失败10次后停止)
  • 确保最终调用了loop->run(),这是ReactPHP异步逻辑运行的核心

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:43:13