使用websockets

时间:2015-11-13 14:49:00

标签: javascript php sockets

我已经能够使用Websockets在使用https://github.com/ghedipunk/PHP-Websockets的用户之间创建聊天应用程序。

当每个用户连接到套接字时,服务器所做的是将所有创建的套接字对象变量存储在一个数组中。因此,最终他创建了一个数组,其中包含有关套接字对象的所有用户的信息。并且他每次循环遍历数组以检索用户的对象,以便可以将消息发送到相应的套接字。

这适用于少量用户。但是我们如何处理大量用户呢?我想过在DB中存储套接字对象,但后来我发现了这个问题:How to save php socket resource in database?

其中说“必须重新创建套接字且无法存储在DB中”。

那么,有没有更好的选择而不是重新创建?如果我必须重新创建套接字,我该如何使用PHP-Websockets库?

提前致谢。

2 个答案:

答案 0 :(得分:1)

套接字无法保存在磁盘上,因为它是现有的连接。如果销毁活动对象,则关闭连接并断开用户连接。

首先,我想提醒您,内存和CPU可能不是很重要。 Node.js解释器实际上速度惊人,WebSocket对象几乎不需要太多内存。您将首先遇到其他问题,例如带宽问题,开放连接太多等等。

我能想到的可能的调整:

多线程 - 生成子进程

您可以在node.js进程之间共享套接字,如下所述:https://nodejs.org/api/child_process.html#child_process_example_sending_server_object

我无法保证这会提高性能,但它允许您并行处理来自不同用户的输入。我也不知道WebSockets是否支持这一点,但我想是的。

减少套接字开销

重要的是要记住 - 您不能将套接字对象存储在磁盘上,但您可以存储大多数其他内容。套接字对象几乎不占用大量内存,但如果您存储有关用户的其他信息,则可能会降低您的速度。冗余信息应该存储在由数据库或类似的东西提供的后端。

原生核心

如果您仍然遇到问题,可以为聊天编写C / C ++本机多线程核心,并让它执行繁重的操作,例如循环访问套接字并发送消息。将此核心连接到逻辑所在的Node.js服务器。也不是说你可以为Node.js编写本机插件。

答案 1 :(得分:0)

使用唯一的user_ids或device_ids。例如,会话ID,并将其存储到DB。比,订阅事件时发送user_id,并仅向该用户发送消息。