【问题标题】:How to broadcast message using Redis and Nodejs with laravel如何使用带有 laravel 的 Redis 和 Nodejs 广播消息
【发布时间】:2016-07-11 17:53:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    为我自己的项目对 Redis 进行一些研究并遇到了您的问题..

    据我了解,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,您只需要在发送端和接收端都将“消息”更新为“消息_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

    【讨论】:

    • hehe 感谢您的回复我应用了类似的方法而不是 Json 数据我发送了一个单独的字符串,用_ 分隔,在前端我只是将它分割成 JS 数组并检查了@消息的 987654331@ 与 Auth::user-&gt;ID 相同,然后将消息附加到其弹出窗口:) 。但是这里每个用户都在监听消息套接字,有没有办法让每个用户都监听自己的套接字,这样当我们发布它时,它只会发送给那个特定的用户??
    猜你喜欢
    • 2013-12-24
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2018-04-02
    • 1970-01-01
    • 2016-07-24
    • 2021-06-21
    相关资源
    最近更新 更多