2016-04-28 22 views
0

私の質問は、ratchetphp/Pawlでのslack rtmの使用に特有です。私は以下のコードを結んでいるが結局は死ぬ。ratchetphp/Pawl websocketクライアントを使用する場合の問題

  <?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(); 

は、実行されると、出力は次のとおり

  [email protected]:/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) 
      [email protected]:/var/www/html/slack# 

のWebSocketが弛みRTM API(https://api.slack.com/rtm)の一部です。それは空のwebsocketで読むときのように、接続が閉じられているようだ。私はそれが私たちがゆるいイベント(https://api.slack.com/events)を聞いて、切断を回避するためにwebsocketを送信したようなものかもしれないと思う。

現在、切断エラーが原因でこの機能は動作しません。

+1

接続が切断される前にこのコードが実行されている期間について考えていただけますか?また、このライブラリはWebSocket pingとpongメッセージを使用しますか?そうでない場合は、Slack APIバージョンのhttps://api.slack.com/rtm#ping_and_pongに対処する必要があります。 – smarx

+0

@smarxコードはすぐに切断されます(つまり、1秒程度)。あなたはソケット接続を維持するためにpingメッセージを追加する必要があると言っていますか?あなたは、イベントループとは異なるアプローチを使用し、代わりにwhile(1)ループを使用する必要があると言っていますか?その中で(1)ループの間、私はソケット接続を維持するためにpingを送信し続けますか?説明してください。 – vishwakarma09

+0

すぐに切断されてしまったら、おそらくping/pongの問題ではないでしょう。 – smarx

答えて

1

Hello World!はこのAPIの有効なメッセージではないため、Slackはそのメッセージを受信すると接続を終了します。何か有効なものを送ってみてください。

関連する問題