如何使用带有laravel的Redis和Nodejs来广播消息

时间:2016-03-24 07:32:25

标签: php node.js redis laravel-5.1 node-redis

我正在使用Redis + laravel + 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

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

});

然后在home.php页面上

    <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>

此处正在向所有登录用户广播该消息,但我想将其更改为仅一个用户

我可以广泛使用特定用户ID的内容

喜欢

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

所以在我的home.php

我可以使用类似的代码

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

1 个答案:

答案 0 :(得分:0)

为我自己的项目做一些关于Redis的研究并遇到了你的问题..

据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,您只需要在发送和接收端将'message'更新为'message_1990'。

Redis - Laravel

这意味着您的Laravel应用程序会知道要将消息发布到哪个频道,这可能并不总是很容易确定,或者该消息可能是团队广播消息。

为了获得灵活性,您可以pass the message in JSON form,然后在客户端上解压缩以确定交付/显示。通过这种方式,消息将传递给每个人,客户端可以决定如何处理它。

Pass PHP array to Javascript

所以在Laravel控制器中:

$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确定如何处理它:

<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>

我在这里使用了JSON.parse(),但它是not always necessary,数据也可以通过数据变量访问,如data.msgtype