A.B*_*per 0 php redis node.js socket.io laravel
我想在 larvel 的动态频道上广播一个事件。
为了在特定频道上广播,我尝试了本教程,一切正常。
这是我的活动:
class ChatNewMessage implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $targetUsers;
public $message;
public function __construct ($message)
{
$this->targetUsers = $message->chat->users->pluck('user_id');
/*This is an array of user that are subscribed to a chat*/
$this->message = $message;
}
public function broadcastOn ()
{
$userChannels = [];
foreach ($this->targetUsers as $id) {
$userChannels[] = 'user-channel.' . $id;
}
return $userChannels;
}
}
Run Code Online (Sandbox Code Playgroud)
这是通过user_id=5获取用户发生的事件的 js 代码:
var socketURL = 'http://127.0.0.1:3000';
var socket = io(socketURL);
socket.on('user-channel.5:App\\Events\\ChatNewMessage', function (event) {
alert(event.data);
});
Run Code Online (Sandbox Code Playgroud)
这是运行 node 的 js 代码:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
// redis.subscribe('user-channel.5', function (err, count) {});
redis.psubscribe('*', function(err, count) {});
redis.on('message', function (channel, message) {
console.log('Message Received: ' + message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function () {
console.log('Listening on Port 3000');
});
redis.on("error", function (err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我使用redis.psubscribe('*', function(err, count) {});订阅像所有通道user-channel.1,user-channel.2,user-channel.3等等。
但这不起作用。
当然,当我在 redis 上使用静态频道名称时redis.subscribe('user-channel.5', function (err, count) {});,一切正常。
我不知道有什么问题以及如何订阅动态创建的频道。
我正在使用 Laravel 5.2。
最后我在下面使用,一切正常:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.psubscribe('*', function(err, count) {});
redis.on('pmessage', function(subscribed, channel, message) {
console.log(channel);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function () {
console.log('Listening on Port 3000');
});
redis.on("error", function (err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |