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