Php 如何使用Redis和Nodejs与laravel一起广播消息
我正在使用Redis+laravel+nodejs来广播消息。我的代码如下 内部控制器Php 如何使用Redis和Nodejs与laravel一起广播消息,php,node.js,redis,laravel-5.1,node-redis,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
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>
所以在我的home.php
我可以用类似这样的代码
<script>
var socket = io.connect('http://localhost:8890');
socket.on('message_1990', function (data) {
$( "#message_1990" ).append( "<p>"+data+"</p>" );
});
</script>
var socket=io.connect('http://localhost:8890');
socket.on('message_1990',函数(数据){
$(“#message_1990”)。追加(“”+data+””);
});
在我自己的项目中对Redis进行了一些研究,发现了你的问题
据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,只需在发送端和接收端将“message”更新为“message_1990”
这意味着您的Laravel应用程序将知道将消息发布到哪个频道,这可能并不总是容易确定,或者消息可能是团队广播消息
为了灵活性,您可以在客户端上简单地解包以确定交付/显示。通过这种方式,消息将传递给每个人,客户机可以决定如何处理它
因此,在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) );
在客户端,确定如何使用它:
<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>
socket.on('message',函数(数据){
obj=JSON.parse(数据);
//接收团队和个人信息
如果((obj.msgtype==“leadGen”)| |(obj.rx==“bsmith”)){
$(“#消息”)。追加(“”+数据+“”);
}
//否则,请忽略此消息
});
在这里,我使用了
JSON.parse()
,但实际上是这样的,而且数据也可以通过数据变量访问,如data.msgtype
为我自己的项目对Redis进行了一些研究,并遇到了您的问题
据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,只需在发送端和接收端将“message”更新为“message_1990”
这意味着您的Laravel应用程序将知道将消息发布到哪个频道,这可能并不总是容易确定,或者消息可能是团队广播消息
为了灵活性,您可以在客户端上简单地解包以确定交付/显示。通过这种方式,消息将传递给每个人,客户机可以决定如何处理它
因此,在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) );
在客户端,确定如何使用它:
<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>
socket.on('message',函数(数据){
obj=JSON.parse(数据);
//接收团队和个人信息
如果((obj.msgtype==“leadGen”)| |(obj.rx==“bsmith”)){
$(“#消息”)。追加(“”+数据+“”);
}
//否则,请忽略此消息
});
在这里我使用了
JSON.parse()
,但实际上是这样的,而且数据也可以通过数据变量访问,正如在data.msgtype中一样,谢谢你的回复,我应用了类似的方法,而不是Json数据,我发送了一个字符串,用
分隔,在前端,我只是将它分割成JS数组并检查它。消息的ID
与Auth::user->ID
相同,然后将消息附加到它的弹出窗口:)。但这里每个用户都在听消息套接字,有没有一种方法可以让每个用户都听自己的socket,这样当我们发布它时,它只会发送给那个特定的用户??hehe感谢您的回复,我采用了类似的方法,而不是Json数据,我发送了一个字符串,用\uuuuu
分隔,在前端,我只是将它切成JS数组,并检查了它的ID
消息与Auth::user->ID
相同,然后将消息附加到其弹出窗口:)。但是在这里,每个用户都在听消息套接字,有没有一种方法每个用户都在听自己的套接字,这样当我们发布消息时,它只会发送给那个特定的用户??