Как перехватить исключение TCP-соединения php websocket с помощью Amphp?

Вот текущий цикл WebSocket, который я запускаю, пока соединение еще живо. Но после 11 часов непрерывного соединения я получил исключение

"exception":"[object] (Amp\\Websocket\\ClosedException(code: 1006): The connection was closed: Client closed the underlying TCP connection at ...

Как я могу проверить закрытое соединение или само исключение?, таким образом я могу правильно завершить логику скрипта без внезапного сбоя.

     \Amp\Loop::run(function () use ($fn, $st)
        {
            $connection = yield \Amp\Websocket\connect('wss://URL');

            yield $connection->send('{"action":"auth","params":"KEYID"}');
            yield $connection->send('{"action":"subscribe","params":"'.$st.'"}');

            $i = 0;

            while ($message = yield $connection->receive()) 
            {
                $i++;
                $payload = yield $message->buffer();

                $r = $fn($payload, $i);

                if ($r == false) {
                    $connection->close();
                    break;
                }
            }
        }
    );

Я использую этот Amphp Websocket: https://github.com/amphp/websocket-client

Спасибо!


person tmarois    schedule 26.11.2019    source источник


Ответы (1)


Я нашел решение этой проблемы, ища ClosedException и запуская другие задачи после того, как он был брошен.

\Amp\Loop::run(function () use ($fn, $st)
    {
        try 
        {
            $connection = yield \Amp\Websocket\connect('wss://URL');

            yield $connection->send('{"action":"auth","params":"KEYID"}');
            yield $connection->send('{"action":"subscribe","params":"'.$st.'"}');

            $i = 0;

            while ($message = yield $connection->receive()) 
            {
                $i++;
                $payload = yield $message->buffer();

                $r = $fn($payload, $i);

                if ($r == false) {
                    $connection->close();
                    break;
                }
            }
        }
        catch (\Amp\Websocket\ClosedException $e) 
        {
            // do something here
        }
    }
);
person tmarois    schedule 02.04.2020