如何使用Redis和Nodejs与laravel一起广播消息


How to broadcast message using Redis and Nodejs with laravel

我正在使用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);
}

在我的服务器.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);

所以在我的家里。php

我可以有类似的代码

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

为自己的项目做一些Redis的研究,发现了你的问题。。

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

Redis-Laravel

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

为了获得灵活性,您可以以JSON形式传递消息,然后在客户端上简单地拆包以确定传递/显示。通过这种方式,消息被传递给每个人,客户可以决定如何处理它

将PHP数组传递给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) );

在客户端,对JSON数据进行解包,以确定如何处理它:

<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(),但它并不总是必需的,数据也可以通过数据变量访问,如data.msgtype