Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Websocket和Pusher显示连接用户登录状态_Php_Pusher - Fatal编程技术网

Php 使用Websocket和Pusher显示连接用户登录状态

Php 使用Websocket和Pusher显示连接用户登录状态,php,pusher,Php,Pusher,我第一次使用Pusher构建了一个聊天室web应用程序。我在Pusher的文档中读了很多,以了解它是如何工作的。我的问题更多的是关于机制,而不是关于代码 所以我想做的是,当一个用户连接并加入状态频道时,它允许我显示谁在线。我想为用户(如Skype)显示一个状态标志(绿色=在线,黄色=离开),所有登录的用户都可以实时看到状态之间的变化 我已经看到,如果我理解的话,每个用户都必须加入一个私有通道,以便更好地管理其客户端事件。因此,我如何管理专用频道的状态更改事件,并将其显示在状态频道中,或者如何在两

我第一次使用Pusher构建了一个聊天室web应用程序。我在Pusher的文档中读了很多,以了解它是如何工作的。我的问题更多的是关于机制,而不是关于代码

所以我想做的是,当一个用户连接并加入
状态频道时,它允许我显示谁在线。我想为用户(如Skype)显示一个状态标志(绿色=在线,黄色=离开),所有登录的用户都可以实时看到状态之间的变化


我已经看到,如果我理解的话,每个用户都必须加入一个私有通道,以便更好地管理其客户端事件。因此,我如何管理
专用频道的状态更改事件,并将其显示在
状态频道中,或者如何在两个频道之间进行通信?

建立用户状态不需要单独的频道

现在实现这一点的最佳方法是使用类似的方法检测用户状态,然后在状态频道上触发事件(可能是
客户机状态更新
),并提供有关用户状态的信息(例如
{“user\u id”:一些用户id,“status”:“away”}

注意:对于客户端事件,事件名称上需要
client-
前缀

您可以使用,也可以在现有的状态通道上执行此操作。但是,您应该知道,通过使用客户端事件,这意味着任何经过身份验证的用户都可能触发一个状态事件,并建议它是针对另一个用户的。因此,通过服务器进行设置会更安全,即使来自正在设置状态的用户也可以设置

然而,我并不认为设置另一个用户的状态有什么好处

下面是一个使用状态通道和客户端事件的示例

<script src="libs/idle.js"></script>
<script src="//js.pusher.com/2.2/pusher.min.js"></script>
<script>
var pusher = new Pusher(APP_KEY);
var presence = pusher.subscribe('presence-online');

// Basic online/offline
presence.bind('pusher:subscription_succeeded', function(members) {
  members.each(addUser);
});

presence.bind('pusher:member_added', addUser);
presence.bind('pusher:member_removed' removeUser);

function addUser(member) {
  // Online - add to UI
}

function removeUser(member) {
  // Offline - remove from UI
  // Consider doing this in a setTimeout
  // in case the user comes back online again
}

// User state
var idle = new Idle({
  onHidden:    function() { sendUserStatus('hidden'); },
  onVisible:   function() { sendUserStatus('visible'); },
  onAway:      function() { sendUserStatus('away'); },
  onAwayBack:  function() { sendUserStatus('hidden'); },
  awayTimeout: 30000 //away with 30 seconds of inactivity
}).start();

function sendUserStatus(status) {
  var userStatusUpdate = {
    "user_id": presence.members.me.id, // current user unique ID
    "status": status
  };
  presence.trigger('client-status-updated', userStatusUpdate);
}

presence.bind('client-status-updated', function(update) {
  var userId = update.user_id;
  var status = user.status;
  // Update UI to reflect user status
});
</script>

var推进器=新推进器(APP_键);
var presence=pusher.subscribe('presence-online');
//基本在线/离线
presence.bind('pusher:subscription\u successed',函数(成员){
成员。每个(添加用户);
});
绑定('pusher:member_added',addUser);
存在。绑定('pusher:member_removed'removeUser');
函数addUser(成员){
//在线-添加到用户界面
}
函数removeUser(成员){
//脱机-从UI中删除
/考虑在StimeTimes中执行此操作
//以防用户再次联机
}
//用户状态
var idle=新的idle({
onHidden:function(){sendUserStatus('hidden');},
onVisible:function(){sendUserStatus('visible');},
onAway:function(){sendUserStatus('away');},
OnAyBack:function(){sendUserStatus('hidden');},
awayTimeout:30000//30秒不活动
}).start();
函数sendUserStatus(状态){
var userStatusUpdate={
“user_id”:presence.members.me.id,//当前用户唯一id
“地位”:地位
};
presence.trigger('client-status-updated',userStatusUpdate);
}
presence.bind('client-status-updated',函数(update){
var userId=update.user\u id;
var status=user.status;
//更新UI以反映用户状态
});

谢谢您的分享。我会看看我能用这些信息做些什么