ReactPHP Socket客户端连接超时

szqfcxe2  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(156)

我们使用ReactPHP来建立一个WebSocket连接并监听一些数据。只要websocket服务器启动并运行,它就能很好地工作。
如果它不能建立WebSocket连接,我需要它在几秒钟后重试,但不能那么远...
我不知道的是如何让ReactPHP的Socket客户端在无法连接时失败(或者WebSocket服务器离线)。我已经尝试过像TimeoutConnector和下面的东西,但无论发生什么,它只是,嗯,什么都不做,就像它连接了一样:

$connector = new \React\Socket\Connector();
$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服务器离线并且无法连接,则无法触发任何事件,只是像连接一样挂起,忽略任何超时。
感谢任何帮助或建议:)

46scxncf

46scxncf1#

我已经在https://github.com/orgs/reactphp/discussions/502中写了一个答案,但为了更好的可见性,我也将在这里发布相同的答案。
我不是100%确定,但我认为问题出在你的命名空间上。如果promise中出现错误,你应该在rejection处理程序的帮助下回显消息,但我认为它不能匹配抛出的特定Exception。这一切都发生在promise内部,如果处理不正确,promise目前正在吞下当前版本中的异常和错误。我们意识到了这种行为,并正在努力通过ReactPHP v3更好地处理错误,您可以在我们的ReactPHP v3愿望列表讨论中阅读更多关于这一点的信息。
在这个例子中我看不到你的use语句,所以我不能确定这是否是确切的问题,但我认为你想在这里使用\Exception而不是Exception。让我知道这是否解决了你的问题。

ngynwnxp

ngynwnxp2#

这个很好用!

public function start($socket) {
    $connector = new \React\Socket\Connector();
    $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);
}

相关问题