我正在使用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>
答案 0 :(得分:0)
为我自己的项目做一些关于Redis的研究并遇到了你的问题..
据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,您只需要在发送和接收端将'message'更新为'message_1990'。
这意味着您的Laravel应用程序会知道要将消息发布到哪个频道,这可能并不总是很容易确定,或者该消息可能是团队广播消息。
为了获得灵活性,您可以pass the message in JSON form,然后在客户端上解压缩以确定交付/显示。通过这种方式,消息将传递给每个人,客户端可以决定如何处理它。
所以在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