我正在使用Laravel 5.0,我有一个视图,其中我显示了多个帖子。我的Post.php,Comment.php和我的User.php
之间存在模型关系home.blade.php查看:
$data = [
'event' => 'UserComment',
'data' => [
'username' => Auth::user()->getUsername(),
'comment' => Request::input('comment'),
'post_id' => $id
]
];
Redis::publish('user-comment', json_encode($data));
使用socket.io v1.3.5,我如何为每个帖子指定评论。例如,我有一个ID为1的帖子和另一个ID为2的帖子。我必须做什么才能使Post 1中的评论留在Post 1中,Post 2中的评论留在Post 2中。目前,在Post 1中发表的评论将出现在Post 2评论部分,反之亦然。
PostController.php
var server = require('http').Server();
var io = require('socket.io')(server);
var Redis = require('ioredis');
var redis = new Redis();
var usernames = {};
redis.subscribe('user-comment');
redis.on('message', function(channel, message){
message = JSON.parse(message);
var room = message.data.post_id;
console.log(room);
// io.emit(channel + ':' + message.event, message.data);
});
server.listen(3000);
server.js
socket.on('user-comment:UserComment', function(data){
$('#home_chat_content_div_body').append($('<h4>').text(data.username).css('color', '#00c5cd'));
$('#home_chat_content_div_body').append($('<p>').text(data.comment));
$('#home_chat_content_div_body').append($('<hr>'));
home.blade.php - javascript
{{1}}
答案 0 :(得分:1)
你有几个选择。但是,基本上你想要从PHP发布评论到SocketIO。从本质上讲,PHP将充当SocketIO的客户端并发出消息。在您的代码中插入注释时,您希望使用以下方法之一将事件发送到SocketIO:
您可以使用ElephantIO:
use ElephantIO\Client as Elephant;
$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);
$elephant->init();
$elephant->send(
ElephantIOClient::TYPE_EVENT,
null,
null,
json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();
echo 'tryin to send `bar` to the event `foo`';
或者,如果您在后台使用Redis,则可以使用SocketIO Redis PHP发射器:
$redis = new \Redis(); // Using the Redis extension provided client
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->emit('chat message', 'payload str');
来源:https://github.com/rase-/socket.io-php-emitter
此外,您将从index.js中删除此代码,因为不再需要它:
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
而且......最新版本的SocketIO是1.3.7。如果可能的话,绝对升级。
为SocketIO使用房间的示例方法:
$redis = new \Redis(); // Using the Redis extension provided client
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->in('post:123'); // send this event only to clients who are in this room for 'new comment'
$emitter->emit('new comment', $dataArray);
然后在你的客户端:
socket.emit('subscribe-post', 'post:123'); // subscribe to events in the post:123 room
socket.on('new comment', function(data){
console.log( data );
});
然后在节点中:
socket.on('subscribe-post', function(room) {
socket.join(room); // join the post:123 room
});