我们正在使用ReactPHP建立一个websocket连接并监听一些数据。只要websocket服务器启动并运行,它就可以很好地工作。
如果它不能使websocket连接,我需要它重试几秒钟后,但不能得到那么远…
我不能弄清楚的是如何得到ReactPHP的Socket客户端失败时,它不能连接(或websocket服务器脱机)。我尝试过TimeoutConnector和下面的东西,但不管发生什么,它只是,嗯,什么也不做,就像它连接:
$connector = new ReactSocketConnector();
$connector->connect('localhost:1234')->then(
function (ConnectionInterface $connection) {
$connection->on('data', function ($data) use ($connection) {
... do all the things ...
});
$connection->on('end', function () use ($connection) {
echo 'end';
});
$connection->on('close', function () use ($connection) {
echo 'close';
});
$connection->on('error', function () use ($connection) {
echo 'error'
});
},
function (Exception $e) {
echo $e->getMessage();
}
);
请注意,我可以得到'end'和'close'事件在成功连接后触发,我只是不能得到任何事件来触发,如果在启动ReactPHP应用程序时,websocket服务器是脱机的,它不能连接,只是挂在那里,就像它连接,忽略任何超时。
谢谢你的帮助和建议:)
我已经在https://github.com/orgs/reactphp/discussions/502上写了一个答案,但我也会把同样的答案贴在这里,以提高可见度。
我不是100%确定,但我认为问题在于您的命名空间。如果在您的承诺中发生错误,您将期望在拒绝处理程序的帮助下回显消息,但我认为它不能与抛出的特定
Exception
匹配。这一切都发生在promise中,如果处理不当,promise目前会吞噬当前版本中的异常和错误。我们已经意识到这种行为,并正在努力在ReactPHP v3中更好地处理这个错误,你可以在我们的ReactPHP v3愿望列表讨论中阅读更多关于这一点的信息。
我在这个例子中看不到你的use语句,所以我不能真正判断这是否是确切的问题,但我认为你想在这里使用
Exception
而不是Exception
。如果这能解决你的问题,请告诉我。
效果很好!
public function start($socket) {
$connector = new ReactSocketConnector();
$connector->connect('localhost:1234')->then(
function (ConnectionInterface $connection) {
$connection->on('data', function ($data) use ($connection) {
... do all the things ...
});
$connection->on('end', function () use ($connection) {
echo 'end';
});
$connection->on('close', function () use ($connection) {
echo 'close';
$this->retry($socket);
});
$connection->on('error', function () use ($connection) {
echo 'error'
});
},
function (Exception $e) {
echo $e->getMessage();
$this->retry($socket);
}
);
}
3秒后重试…
function retry(&$socket) {
global $loop;
$loop->addTimer(3, fn() => $this->start($socket);
}