Проблемы с использованием веб-клиента ratchetphp/Pawl

Мой вопрос касается использования slack rtm на ratchetphp/Pawl. У меня есть код ниже, который нормально подключается, но в конце концов умирает.

            <?php

            require_once "response.php";

            //first make authenticated call to rtm.start    
            use \Curl\Curl;
            $curl = new Curl();

            $rtmStartUrl = "https://slack.com/api/rtm.start?token=xx-xx-xx-xx-xx&pretty=1";
            $curl->get($rtmStartUrl);

            $wsUrl = $curl->response->url;

            $loop = React\EventLoop\Factory::create();
            $connector = new Ratchet\Client\Connector($loop);

            $connector($wsUrl)
            ->then(function(Ratchet\Client\WebSocket $conn) {
            $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
            echo "Received: {$msg}\n";
            // $conn->close();
            });

            $conn->on('close', function($code = null, $reason = null) {
            echo "Connection closed ({$code} - {$reason})\n";
            });

            $conn->send('Hello World!');
            }, function(\Exception $e) use ($loop) {
            echo "Could not connect: {$e->getMessage()}\n";
            $loop->stop();
            });

            $loop->run();

При запуске вывод:

            root@ip-172-31-45-75:/var/www/html/slack# php pawl.php 
            Received: {"type":"hello"}
            Received: {"type":"reconnect_url","url":"wss://mpmulti-qpau.slack-msgs.com/websocket/jDkgDysXfZspRj10zqdcrshHK6PhPLItYx2HEkdXy47RPCAJwKgI_NLq0bhS4uMjIT7iRtOoCDUJffcxcr7YdiqMbITUZYqnTmT39Et5a8JeuPLFfCUUzan4MCz34p0jcfAKaQW9G9HpIWrYH4CTqyICZuhgWHnzo8K7dO2zXFc="}
            Received: {}
            Connection closed (1006 - Underlying connection closed)
            root@ip-172-31-45-75:/var/www/html/slack# 

Веб-сокет является частью API slack rtm (https://api.slack.com/rtm). Похоже, что при чтении на пустом веб-сокете соединение закрывается. Я думаю, это может быть похоже на то, как мы слушаем slack-события (https://api.slack.com/events ) отправляется через веб-сокет для работы, чтобы избежать отключения.

В настоящее время это не работает из-за ошибки отключения.


person vishwakarma09    schedule 28.04.2016    source источник
comment
Можете ли вы дать нам представление о том, как долго выполняется этот код, прежде чем соединение будет закрыто? Кроме того, использует ли эта библиотека сообщения ping и pong WebSocket? Если нет, возможно, вам придется иметь дело с версией Slack API: api.slack.com/rtm# пинг_и_понг.   -  person user94559    schedule 28.04.2016
comment
@smarx код отключается почти сразу (т.е. примерно через 1 секунду). Вы говорите, что мне нужно добавить сообщения ping, чтобы поддерживать подключение к сокету? Вы хотите сказать, что мне нужно использовать другой подход, чем цикл событий, и вместо этого использовать цикл while (1). В этом цикле while(1) я буду продолжать отправлять ping, чтобы поддерживать подключение к сокету? Пожалуйста, объясни.   -  person vishwakarma09    schedule 28.04.2016
comment
Я бы сказал, что если вы отключаетесь почти сразу, это, вероятно, не проблема пинг-понга.   -  person user94559    schedule 28.04.2016
comment
Еще одно предположение... это может быть Hello World! вы отправляете на сокет? Это не то, что Slack будет обрабатывать как действительное сообщение ... возможно, он вешает сокет после того, как это сообщение попадет.   -  person user94559    schedule 28.04.2016
comment
@smarx О, отлично! это решило я думаю. Цикл работает 5 минут на данный момент. Как вы думаете, теперь я столкнусь с проблемой пинга?   -  person vishwakarma09    schedule 28.04.2016
comment
Есть только один способ узнать. :-) Пусть он поработает где-то час или около того без активности, чтобы убедиться?   -  person user94559    schedule 28.04.2016
comment
Это действительно весело и просто :) Как мне отметить ваш комментарий как ответ? Или вам нужно опубликовать ответ снова.   -  person vishwakarma09    schedule 28.04.2016
comment
Я разместил ответ, чтобы вы могли отметить его. Спасибо!   -  person user94559    schedule 28.04.2016


Ответы (1)


Hello World! не является допустимым сообщением для этого API, поэтому Slack закрывает соединение, когда получает это сообщение. Попробуйте отправить что-нибудь действительное (или вообще ничего).

person user94559    schedule 28.04.2016