如何实现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
相关产品推荐
相关产品推荐

