9

这是一个简单的 javascript 案例,它不断询问“还有吗?” 就像一个四岁的孩子开车一样。但是,就像父母一样,如果你经常这样做,或者一次有太多孩子,服务器会在压力下崩溃。

您如何解决网页以每 5 秒的顺序查找新内容并允许更多访问者的问题?

4

9 回答 9

5

stackoverflow 以某种方式做到这一点,但不知道如何。

更标准的方式确实是每隔几秒钟寻找新内容的 javascript。

更高级的方法是使用类似推送的技术,通过使用Comet技术(长轮询等)。该链接下有很多有趣的东西。

我还在等待一个自己使用它的好机会......

哦,这里有一个来自 stackoverflow 的链接:
有什么方法可以将数据从 Web 服务器推送到浏览器?

于 2008-11-14T10:12:02.037 回答
2

在 Java 中,我使用 Comet 技术使用 Ajax 库 (DWR) - 我认为您应该使用它在 PHP 中搜索库。这个想法是服务器正在发送一个非常长的 Http 响应,当它有东西要发送给客户端时,它会结束它并发送带有更新数据的新响应。使用它客户端不必每隔 x 秒 ping 服务器来获取新数据 - 我认为它可以帮助你。

于 2008-11-14T10:27:39.883 回答
2

您可以根据客户端的数量使轮询时间可变。用你的比喻,孩子问“我们到了吗?” 司机回答“不,但可能在一小时内”。值得庆幸的是,Javascript 不是一个顽固的孩子,所以你可以确定他在那之前不会打扰你。

于 2008-11-14T12:07:14.723 回答
2

您可以考虑开始每 5 秒轮询一次,但过一段时间开始增加轮询间隔时间 - 可能达到某个上限(1 分钟、5 分钟 - 任何看起来最适合您的使用)。增加不一定是线性的。

一个更复杂的旋转(可以结合 monzee 的建议以根据客户端数量而变化)是允许服务器在下一次轮询之前指定间隔。然后,服务器可以随着时间的推移增加间隔,您甚至可以动态更改算法,或响应网络负载。

于 2008-11-14T12:13:35.193 回答
1

你可以看看 python 中的“Twisted”框架。它是事件驱动的网络编程框架,可能满足您的需求。它可用于从服务器推送消息。

于 2008-11-14T10:17:46.830 回答
1

也许您可以将查询发送到一个真正简单的脚本,它不需要进行真正的数据库查询,而只使用一个简单的时间戳来判断是否有任何新内容。

然后,如果答案是真的,你可以做一个真正的查询,服务器必须做真正的工作!-)

于 2008-11-14T10:18:58.030 回答
0

我将有一个调用数据库的实例,如果存在更新的时间戳,则将该新时间戳放入应用程序变量中。然后让所有会话检查该应用程序变量。或类似的东西。这样只有一个实例在调用 sql-server,客户端的数量无关紧要。

我还没有尝试过,这只是头顶上的第一个想法,但我认为兑现时间戳并让客户检查兑现是一种方法,以及如何实现兑现(sql-server-cash,应用程序变量等等)我不知道什么是最好的。

于 2008-11-14T12:29:08.487 回答
0

关于 SO 是如何做到的,请注意它不会持续检查新答案,只有当您输入“您的答案”框时。

那么,关键是首先进行计算成本低的操作以清除常见的“不需要更新”情况(例如,输入新答案或检查时间戳),然后再启动更昂贵的过程来实际检索任何更改。

或者,根据您的应用程序,您可以通过优化更改发布机制来解决此问题。例如,将更改(或它们的摘要)放在 RSS 提要上并让客户观看提要而不是真正的应用程序也许是可行的。我们可以假设这将是相当有效的,因为它正是 RSS 设计和优化的那种东西,而且它还有一个额外的好处,就是使您的应用程序与世界其他地方的互操作性更高,而成本很低或没有成本你。

于 2008-11-14T18:45:30.927 回答
0

我相信该方法应该基于服务器端套接字和客户端 ajax/comet 的组合。像:

假设一个聊天应用程序有多个登录用户,并且每个用户都通过对服务器端侦听器脚本的慢负载 AJAX 调用进行侦听。

无论浏览器获取刚刚输入的数据,都会通过对编写器脚本的 ajax 调用将其提交给服务器。该服务器更新数据库(或存储系统)并将套接字写入通知的侦听器脚本。然后后者获取新数据并将其发送回客户端浏览器。

现在我还没有写这个,现在我不知道两个并发连接的浏览器限制是否/如何破坏上述逻辑。

将不胜感激在这里听到任何有想法的人。

作为

于 2008-11-15T17:45:00.080 回答