javascript - 选择用户与用户通信的方法

标签 javascript php web

假设我想创建一个聊天服务。在我看来,有两种做事的方法,我想知道你们认为更好的方法是什么。或者也许还有第三种选择......我不知道。

无论如何

解决方案1:

有一个 JavaScript 循环,我每隔一段时间向服务器发送一个请求,检查数据库中是否有可能发生的任何新消息。当我看到我的数据库有一个标志表明她的新文本行时,调用另一个函数来检索和显示

解决方案2:

对服务器上的方法进行异步调用,该方法在服务器上循环等待新条目,然后当它到达那里时将响应发送到客户端。

我不知道其中一个解决方案是否更自然,我想知道机器人是否疯狂地告诉我哪种解决方案是执行此操作的正确方法。

这里的重点不是聊天服务,而是如何处理来自一个网页用户的显示输入,以显示给观看相同内容的所有用户。

额外信息: 计划在客户端使用 html/css/js,在服务器上使用 php + sql。

编辑:我不想开始讨论,基本上我只是想知道解决方案 1 是否存在性能问题,这些问题是什么,并根据 griffin 的回复判断,当我刷新时,问题从 65k 用户开始每秒,这对于我的范围来说是可以接受的。

最佳答案

这取决于情况,但我认为您应该选择解决方案 1。请继续阅读以了解我为什么这么认为。

解决方案 1 应该更容易实现,如果您的服务器每秒可以处理超过 65k 个请求,您应该使用它,因为否则您将达到端口限制(假设您在负载增加之前仅使用一台网络设备。

解决方案 2 可能更难实现,还因为由于竞争条件、超时(至少是客户端,但取决于您的控制程度),您必须在解决方案 1 之上实现它超过你的服务器,服务器端也是如此)。好处是,如果做得正确,它可能比解决方案 1 更有效,也就是说,直到您达到端口限制(您可能不会使用标准单服务器 LAMP 设置执行此操作)

关于解决方案 2,您还可以使用 websockets,这应该可以防止一些问题(超时,如果您做得正确的话),并为您提供更好的性能,但代价是跨浏览器问题。

正如您所说,您将使用 php 和某种形式的 sql(我认为您可能指的是 mysql),请使用解决方案 1。至于原因:只要您使用用于编写模板的脚本语言(查一下php的历史),你不应该过多考虑性能之类的,而应该考虑把事情做好,就这一点而言,解决方案1肯定更容易实现,没有问题。只需确保使用正确的数据库索引并保持每个请求的开销尽可能低(例如,不要启动完整的框架,但实际上只执行 1 个(my-)sql 查询)

除了已经提到的那些之外,您还可以使用分块传输来替代服务器发送事件。要使其在不同的浏览器上运行还需要做一些工作,但它也适用于低延迟通信。除此之外,它在端口限制方面与 Websocket 解决方案具有相同的缺点,因为服务器和客户端之间始终存在开放的连接。

另一种可能性是使用现成的聊天应用程序甚至聊天服务 - 有大量现成的解决方案,其中一些甚至使用自己的网络服务器来获得更好的性能/功能。对于现成的解决方案,您可以查看 Node.JS 和 Socket.IO (服务器端 javascript),对于聊天即服务,这取决于您的情况。例如,Livechat 为客户 <-> 支持会谈提供聊天服务。

<小时/>

在更多人在考虑服务器上的 sleep /查询循环时建议解决方案 2 之前:

实现解决方案 2 的正确方法是使用线程间/进程间通信 (IPC),这确实可以降低延迟并节省资源。其中的一个例子是信号量、互斥体或条件变量(sem_* 和 pthread_* 函数)。否则,您将遇到与解决方案 1 相同的延迟和资源浪费,还会出现额外的跨浏览器问题,并且需要更多工作来干净地实现它。另外,在这种情况下,您可能应该停止使用某种基于 sql 的数据库和脚本语言,并转向性能更好的语言(C、C++、Java - 如今,甚至服务器端 javascript 在这些任务上的性能也优于 php,请参阅 Socket.上面的IO链接)

关于javascript - 选择用户与用户通信的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346391/

相关文章:

security - 为什么人们公开发布他们的验证码?验证码 : somerandomword

javascript - 使用 jQuery 和数据类将输入复制到不同的单元格中

javascript - 根据输入字段更改选择选项值

javascript - 类型错误 : Object function EventEmitter()

javascript - 使用 PHP 将 MySQL 时间以毫秒转换为 javascript 时间戳

javascript - 开始时的 JQuery 可拖动更改元素

javascript - 比较 JavaScript 对象数组属性与字符串

javascript - AngularJS $http.post 在成功回调时返回一个空变量

php - 如何在 MySQL 语句中包含 PHP 变量

jquery - 最佳移动网站 UI 框架