Ajax“有新内容吗?如果有,更新页面”——如何在不破坏服务器的情况下做到这一点?

Posted

技术标签:

【中文标题】Ajax“有新内容吗?如果有,更新页面”——如何在不破坏服务器的情况下做到这一点?【英文标题】:Ajax "Is there new content? If so, update page" - How to do this without breaking the server? 【发布时间】:2010-09-22 07:48:30 【问题描述】:

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

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

【问题讨论】:

有一些很好的答案,所以它一定是一个很好的问题。为什么不对这个问题投票? 我认为这是一个好问题。尤其是因为有很多网站显然是由从未问过的人编写的!你得到我的投票:-) 【参考方案1】:

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

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

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

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

希望在这里听到任何有想法的人。

作为

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

请告诉我为什么我的想法不好,以便我从中学习。 //谢谢。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

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

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

哦,这里有一个来自 *** 的链接:Is there some way to PUSH data from web server to browser?

【讨论】:

哦,我忘了回答主要问题:通过使用长轮询技术,服务器负载应该会减少,因为连接可能会闲置更长的时间,如果碰巧死了,最终会重新打开自己.

以上是关于Ajax“有新内容吗?如果有,更新页面”——如何在不破坏服务器的情况下做到这一点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cakephp 3 的 ajax 调用中定义 CSRF 令牌。此外,对于某些 ajax 请求,如何关闭 CSRF

如何在Django使用ajax的POST

JQuery Ajax - 如何在进行 Ajax 调用时检测网络连接错误

如何在Django使用ajax的POST

如何在ajax成功中调用('keyup')

如何在所有 ajax 请求中发送令牌