2016-03-24 19 views
1

私はRedis + laravel + nodejsを使ってメッセージをブロードキャストしています。私のコードはここにメッセージが放送されているhome.phpページに、コントローラでlaravelでRedisとNodejsを使ってメッセージをブロードキャストする方法

に従ってください

function postReassignlead(Request $request){ 
    $data = Input::get(); 
    $leadId = $data['leadid']; 
    $assignedtoid = $data['assignedtoid']; 
    $assignedbyid = $data['assignedbyid']; 

    $message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid.""; 

    $redis = LRedis::connection(); 
    $redis->publish('message', $message); 

} 

として、私のserver.jsに

<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 
    <script src="https://cdn.socket.io/socket.io-1.3.4.js"></script> 

    <div class="container"> 
     <div class="row"> 
      <div class="col-lg-8 col-lg-offset-2"> 
       <div id="messages"></div> 
      </div> 
     </div> 
    </div> 
    <script> 
     var socket = io.connect('http://localhost:8890'); 
     socket.on('message', function (data) { 
      $("#messages").append("<p>"+data+"</p>"); 
     }); 
    </script> 

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

server.listen(8890); 

io.on('connection', function (socket) { 

    console.log("new client connected"); 
    var redisClient = redis.createClient(); 
    redisClient.subscribe('message'); 

    redisClient.on("message", function(channel, message) { 
    console.log("mew message in queue "+ message + "channel"); 
    socket.emit(channel, message); 
    //res.flush(); 
    }); 

    socket.on('disconnect', function() { 
    redisClient.quit(); 
    }); 

}); 

ですログインしているすべてのユーザーに、この変更を1人のユーザーに変更したい

$redis = LRedis::connection(); 
    $redis->publish('message_1990', $message); 

と同様に、特定のユーザID

への広範な私ができる何かので、私のhome.php

に、私はいくつかをやって、この

<script> 
     var socket = io.connect('http://localhost:8890'); 
     socket.on('message_1990', function (data) { 
      $("#message_1990").append("<p>"+data+"</p>"); 
     }); 
</script> 

答えて

0

のようなコードに何かを持つことができます私自身のプロジェクトのためにRedisを研究し、あなたの質問に出会った..

私が理解しているところでは、パブリッシュとサブスクライブのメソッドの最初のパラメーターは、通信に使用されている「チャネル」です。あなたのケースでは、送信側と受信側の両方で 'message_1990'に 'message'を更新するだけで済みます。

Redis - Laravel

これはあなたのLaravelのアプリが常に容易に決定すること、または多分メッセージは、チームのブロードキャストメッセージではない可能性がある、にメッセージをパブリッシュするためにどのチャネルを知っているだろうことを意味します。

柔軟性のために、pass the message in JSON formとすることができます。次に、クライアントで配信/表示を決定するために単純にアンパッケージします。この方法で、メッセージは全員に配信され、クライアントはそのメッセージを使って何をすべきかを決めることができます。 Laravelコントローラ内だから、

Pass PHP array to Javascript

:私はJSON.parse()使用しました

ここ
<script> 
    socket.on('message', function (data) { 
     obj = JSON.parse(data); 

     // receive team and personal messages 
     if((obj.msgtype == "leadGen") || (obj.rx == "bsmith")) { 
      $("#message").append("<p>"+data+"</p>"); 
     } 
     // else ignore the message 

    }); 
</script> 

それ:

$message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid.""; 

$redis = LRedis::connection(); 

// PHP array to convert to JSON, add other fields as necessary 
$msgPacket = ["rx"=>"bsmith","msgtype"=>"leadGen","message"=>$message]; 

// send as a JSON data packet 
$redis->publish('message', json_encode($msgPacket)); 

クライアント側unpackage the JSON dataには、それをどのように処理するかを決定しますnot always necessaryであり、データはのようにデータ変数からアクセスすることもできます0

+0

私はJSONデータの代わりに同様のアプローチを適用しました。私は1つの文字列を '_ 'で区切って送りました。フロントエンドではJS配列に割り、' ID'をチェックしました。メッセージは 'Auth :: user-> ID'と同じです。メッセージはそのポップアップに追加されます:)。しかし、ここではすべてのユーザーがメッセージソケットを聞いている、すべてのユーザーが独自のソケットを聞く方法はありますか? – Vikram

関連する問題