Как транслировать сообщения используя Redis и Nodejs с 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);

}

и в моем 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>

Здесь сообщение транслируется всем вошедшим в систему пользователям, но я хочу изменить это только на одного пользователя

что-то, что я могу расширить для конкретного пользователя

подобно

    $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>

1

Решение

Делал некоторые исследования по 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]