我有一个使用apache / mysql / php在共享服务器上运行的网站。该站点的每个页面都属于一个注册用户,该用户一旦登录就可以编辑该页面。不是页面所有者的其他用户只能查看这些页面,但不能执行任何其他操作。
现在我计划在我的应用程序中添加聊天功能。基本的想法是,如果页面的所有者在浏览器中打开并登录,则将向其他用户(将是匿名的)显示为"可用于聊天"。访问该页面的其他用户将能够向他发送消息,反之亦然。匿名用户不需要彼此通信,只能与注册用户(页面所有者)通信。所以基本结构就是这样:
匿名用户访问该页面。该页面的注册所有者不会查看同一页面,也无法进行聊天。
注册所有者登录并在浏览器中打开其页面。所有注册用户都是实时通知所有者现在可以聊天。
匿名用户可以向他发送消息。
注册用户收到消息并可以回复给每个用户
其他用户可以随时加入并与注册用户聊天。这一切都是实时发生的,注册用户可以看到谁来访问他的页面并离开。
现在,在步骤3和4中,我需要知道注册用户是否仍然登录。如果是,则消息可以进一步传递给目标用户。如果没有,那么我需要发送一条消息,表明所有者(注册用户)不再可用于聊天。
我正在寻求有关如何最好地实施它的建议:
使用旧学校的php和ajax调用。因此,每个用户每秒钟都会向服务器和服务器发送ajax请求,以便以某种方式跟踪每个对话。我认为相对容易实现。我没想到会有大量用户,但我可以想象服务器上会有很多用户。
使用node.js.
现在我的问题:
上述解决方案1可能出现的问题。在服务器上经常抛出ajax请求会不会太沉重?会是合理的用户数量吗?
在我的共享主机上使用节点js ...假设可以安装它并在单独的端口上运行它,我最好怎么检查注册用户是否仍然登录?任何想法都会受到赞赏,因为我的想法不合时宜。
答案 0 :(得分:4)
你是对的,PHP / Ajax调用会导致相当多的服务器负载,特别是如果你的Apache / PHP堆栈需要大量的内存来引导。 PHP系统中的许多聊天模块,例如Drupal,实际上将此职责卸载到专门的node.js服务器(您提到的第二种方法)以便于扩展。
您可以考虑的另一种方法是使用PubNub等实时网络来促进用户到用户的数据传输。 PubNub有一个名为Presence的工具包,它可以帮助告知谁订阅或取消订阅每个频道。
为了满足您的要求,我想通过在您的JavaScript中发出此调用,每个用户都会在登陆时注册他们正在查看的页面:
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>
<script>
var pubnub = PUBNUB({
uuid : '12345-page35' //You can define this for each user
})
pubnub.subscribe({
channel : 'site-wide-chat,page35', //Subscribe to two channels!
message : receive_chat, //Callback function
presence : user_joined //Callback function
})
</script>
当“所有者”登录时,通知查看该页面的其他用户。你可以这样做:
function user_joined(event) {
if (event.uuid.match(/page35/)) { //You can set your own test here
// .... admin available for chat
}
}
Presence还有一系列漂亮的功能,例如能够让所有用户订阅当前频道:
pubnub.here_now({
channel : 'page35',
callback : function(m){console.log(m)}
});
我希望这可以帮助您构建最小的可行产品。由于所有内容都是在编程语言级别实现的,因此您应该有很大的灵活性来制作可自定义的聊天解决方案,而不会在服务器上增加额外的复杂性或开销。