2016-12-01 18 views
0

私のWebアプリケーション(symfony3)では、リアルタイム通知システムを統合しようとしています。 私はこのような構成でこれを行うに選択: サーバNodeJS サーバのRedis socket.io-PHP-エミッタ(直接PHPから発光通知用のPHP adaptater) socket.iosocket.ioとredisによるリアルタイム通知

app.js(サーバノード)

var app = require('express')(); 
var http = require('http').Server(app); 
var server = require('http').createServer(); 
var io = require('socket.io').listen(server); 
var redis = require('socket.io-redis'); 

io.sockets.on('connection', function (socket) { 
    console.log('user connected!'); 
}); 

io.adapter(redis({ host: 'localhost', port: 6379 })); 
server.listen(8081, 'myhost'); 

テストコントローラ

public function testAction(Request $request) 
{ 
    $notification = 'A message has been received by the server!<br />' 
    $form = $this->createFormBuilder()->getForm(); 
    $form->handleRequest($request); 
    if ($form->isValid()) { 
     $redis = new \Redis(); 
     $redis->connect('127.0.0.1', '6379'); 
     $emitter = new SocketIO\Emitter($redis); 
     $emitter->emit('notification', $notification); 
     $response = new JsonResponse(); 
     $response->setData(array(
      'notification' => $notification 
     )); 
     return $response; 
    } 
    return $this->render('@PMPlatform/Test/test.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

クライアントビュー

Okこの簡単なテストはうまくいきます:適切なビューからフォームを送信すると、このページにあるすべてのクライアントに通知が表示されます。

1-私は、1人のユーザーが他のユーザーに通知を送信できるようにしたいと考えています(ユーザーが投稿にコメントすると、投稿者は通知を受け取りました)。どのように私はこれを行うことができますか?

2著者が接続されていない場合、作成者が接続し直したときに通知を保存する方法を教えてください。

+0

あなたが私に尋ねると、これはかなり広い質問です。これを達成する方法はたくさんあります。 1つの方法は、データベースに格納して、ページの読み込みまたは読み込みで取得することです。 –

答えて

1

あなたの最初の質問では、何らかの方法でサーバーを維持しています。たとえば、接続されたすべてのクライアントをソケットで一覧表示します。しかし、ここで重要なのは、ユーザーがサーバーに接続するときにIDを渡すことです。これで、自分のIDで完全に識別されたsocket.ioサーバーのユーザーがいます。

io.sockets.on('connection', function (socket) { 
    console.log(socket); 
}); 

接続に付属のソケットオブジェクトを見ると、接続したばかりのユーザーのIDが表示されます。 そのユーザーに通知を送信する場合は、通知を送信するユーザーIDに対応するソケットのredisで検索するだけです。エミッタをインスタンス化すると、その特定のソケットのためにredisで検索する必要があります。ユーザーIDで赤色で検索する必要があります。

2番目の質問では、この機能のWebソケットには入りません。ユーザーが接続するたびに、保留中の通知があればデータベース内を検索し、彼に送信する必要があります。これは、計算量が多くなることなく、少量のユーザーに対して行うことができますが、これは一定の縮尺ではありません。私は意志この目的のために :接続されていない場合は接続ユーザー

  • ためのRedisで

    • 検索して、データベースに新しい通知を保存します。
    • ユーザーが再び接続すると、標準のHTTPリクエストをAPIに送信し、保留中の通知をすべて送信して処理し、必要な変更を加えます。

    希望します。私はあなたが接続でデータを渡す方法を説明するのを忘れて

    EDIT

    。クライアント上で:var socket = io('http://216.157.91.131:8080/', { userId: "myUserId" });を実行してください。簡単じゃないですか?

  • +0

    あなたの説明に感謝します!だから私が正しく理解すれば、私はredis dbに通知を保存することができません?私はリアルタイムの通知システムを伝統的な格納方法(doctrine ymsqlのようなもの)と結合する必要がありますか? –

    +0

    もちろん可能です!ただし、サーバーに接続するクライアントの数によって異なります。あなたのインフラストラクチャが問題なく処理できると思うなら、 'io.sockets.on( 'connection')'イベントが発生するたびに、あなたの保留中の通知をredisで検索するだけです。しかし、NodeJSサーバからこのユーザソケットによる通知を出さなければならないので、PHPからそれを行うことはできません。 – Jorge

    +0

    オクラホマですが、あなたの投稿には「接続されていなければ、データベースに新しい通知を保存してください」ということはどういう意味ですか? ?あなたはredis dbやmysqlのような伝統的なdbについて話しますか? –

    関連する問題