2016-05-02 11 views
0

私はPHPウェブソケットの初心者です。私はデータベースストレージを使ってリアルタイムチャットを作成しようとしています。私はかなりうまくやっていましたが、今は一つの問題に立っています。 user1がuser2にメッセージを送信し、user2が最初にサイトに来たとき(localhosteで最初にリロード)、「リアルタイム」にならないという問題があります。ラツチェットウェブソケットを使ったPHPリアルタイムチャット

さらに詳しく説明します。

ここに私のserver.phpです。それはpracticlyラチェットチュートリアルと同じである:pusher.php

$loop = React\EventLoop\Factory::create();  
$pusher = new \Pusher(); 
$context = new React\ZMQ\Context($loop); 
$pull = $context->getSocket(ZMQ::SOCKET_PULL); 
$pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself 
$pull->on('message', array($pusher, 'onBlogEntry')); 
$webSock = new React\Socket\Server($loop); 
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect 
$webServer = new Ratchet\Server\IoServer(
     new Ratchet\Http\HttpServer(
     new Ratchet\WebSocket\WsServer(
     new Ratchet\Wamp\WampServer($pusher))), $webSock); 
$loop->run(); 

は(私は他の非重要なものを省略)、これらの方法で最も重要です:私のプレゼンタークラスで

protected $subscribedTopics = array(); 
protected $myID = array(); 

public function onSubscribe(ConnectionInterface $conn, $data) { 
    $this->subscribedTopics[json_decode($data)->teamID] = $data; 
    $this->myID[json_decode($data)->userID] = $data;  
} 

public function onBlogEntry($entry) { 
    $entryData = json_decode($entry, true); 

    if ((!array_key_exists($entryData['team_id'], $this->subscribedTopics)) || 
      (!array_key_exists($entryData['to_user_id'], $this->myID)) 
    ) { 
     return; 
    } 

    $teamID = $this->subscribedTopics[$entryData['team_id']]; 
    $teamID->broadcast($entryData); 
} 

私は単純な形をしています。ユーザーがこのフォームを送信すると、このコードは次のとおりです。私の問題に戻って、だから、

var myJSON = '{' 
      + '"teamID" : {$teamId},'  //this I get from the presenter 
      + '"userID" : {$userId}'  //this I get from the presenter 
      + '}'; 
var conn = new ab.Session('ws://localhost:8080', 
     function() { 
      conn.subscribe(myJSON, function(topic, data) { 
      if (data.from_user_id == mypartnerIdA) {      
         //here I edit the DOM 
        } 
       }); 
      }, 
      function() { 
       console.warn('WebSocket connection closed'); 
      }, 
      {'skipSubprotocolCheck': true} 
    ); 

$this->chatPartner = $values['to_user_id'];  //this I get from the form 
$this->redrawControl('msg');      //here I redraw my layout 
$this->messages_model->addMessage($values);  //here I send data to database 
$context = new \ZMQContext(); 
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'my pusher'); 
$socket->connect("tcp://localhost:5555"); 
$socket->send(json_encode($values)); 

その後、ビューに私はこのJavaScriptコードを持っています。私は2人のユーザーをシミュレートします。 User1はこのページを再読み込みします。ここではjavascript接続が最初にあります。 User2は彼の後にこのページをリロードします。 User1がuser2にメッセージを送信すると、メッセージはすぐに(リアルタイム)表示されます。しかし、user2がuser1にメッセージを送信すると、このメッセージはすぐには表示されません。このメッセージは、次のページの再読み込み後にのみ表示されます。

私の質問はです - これを修正するにはどうすればよいですか? user2のメッセージをリアルタイムで作成するにはどうすればいいですか?このコードを修正するにはどうしたらいいですか?

答えて

0

あなたはおそらく、購読するデータがあなたのものであると誤解しているでしょう。 チャットセッションのIDに使用されます。例えば

  • Aは(chatId = 1)
  • BはCとのチャットをBとのチャットを有している(chatId = 2)
  • Cは(chatId =とのチャットを有します3)
  • A、B及びCは、一人のチャット(chatId = 4)である
  • var chatId = 2; //this chat is only between users B and C 
    conn.subscribe(chatId , function(topic, data) { 
        ... 
    } 
    

私がそれを理解する最も簡単な方法は、それをtwitterのハッシュタグと比較することでした。 各ハッシュタグはチャットIDです。 ハッシュタグ/チャットIDへの各サブスクリプションごとに。あなたはWebSocket接続を持っているので、すべての更新を受け取ることができます。

これは、長期的にこれを行うための簡単な方法です。次に、userIdパラメータの細分化された接続を使用すると簡単になります。 データベースに簡単に保存して、誰にメッセージを送信するかを知らせることもできます。

+0

男、ありがとう、私は信じていない、誰かが私をここで助けてください:)) – mrow

+0

あなたがもっと知りたい場合は、私に教えてください – mitchken

関連する問題