将node.js的聊天添加到现有的php网站

时间:2014-03-19 20:13:07

标签: php node.js apache chat

我有一个使用apache / mysql / php在共享服务器上运行的网站。该站点的每个页面都属于一个注册用户,该用户一旦登录就可以编辑该页面。不是页面所有者的其他用户只能查看这些页面,但不能执行任何其他操作。

现在我计划在我的应用程序中添加聊天功能。基本的想法是,如果页面的所有者在浏览器中打开并登录,则将向其他用户(将是匿名的)显示为"可用于聊天"。访问该页面的其他用户将能够向他发送消息,反之亦然。匿名用户不需要彼此通信,只能与注册用户(页面所有者)通信。所以基本结构就是这样:

  1. 匿名用户访问该页面。该页面的注册所有者不会查看同一页面,也无法进行聊天。

  2. 注册所有者登录并在浏览器中打开其页面。所有注册用户都是实时通知所有者现在可以聊天。

  3. 匿名用户可以向他发送消息。

  4. 注册用户收到消息并可以回复给每个用户

  5. 其他用户可以随时加入并与注册用户聊天。这一切都是实时发生的,注册用户可以看到谁来访问他的页面并离开。

    现在,在步骤3和4中,我需要知道注册用户是否仍然登录。如果是,则消息可以进一步传递给目标用户。如果没有,那么我需要发送一条消息,表明所有者(注册用户)不再可用于聊天。

    我正在寻求有关如何最好地实施它的建议:

    1. 使用旧学校的php和ajax调用。因此,每个用户每秒钟都会向服务器和服务器发送ajax请求,以便以某种方式跟踪每个对话。我认为相对容易实现。我没想到会有大量用户,但我可以想象服务器上会有很多用户。

    2. 使用node.js.

    3. 现在我的问题:

      1. 上述解决方案1可能出现的问题。在服务器上经常抛出ajax请求会不会太沉重?会是合理的用户数量吗?

      2. 在我的共享主机上使用节点js ...假设可以安装它并在单独的端口上运行它,我最好怎么检查注册用户是否仍然登录?任何想法都会受到赞赏,因为我的想法不合时宜。

1 个答案:

答案 0 :(得分:4)

你是对的,PHP / Ajax调用会导致相当多的服务器负载,特别是如果你的Apache / PHP堆栈需要大量的内存来引导。 PHP系统中的许多聊天模块,例如Drupal,实际上将此职责卸载到专门的node.js服务器(您提到的第二种方法)以便于扩展。

您可以考虑的另一种方法是使用PubNub等实时网络来促进用户到用户的数据传输。 PubNub有一个名为Presence的工具包,它可以帮助告知谁订阅或取消订阅每个频道。

PubNub Presence demo

为了满足您的要求,我想通过在您的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)}
});

我希望这可以帮助您构建最小的可行产品。由于所有内容都是在编程语言级别实现的,因此您应该有很大的灵活性来制作可自定义的聊天解决方案,而不会在服务器上增加额外的复杂性或开销。