代码之家  ›  专栏  ›  技术社区  ›  Alexander Morland

Ajax“有新内容吗?如果是这样,更新页面“—如何在不破坏服务器的情况下进行此操作?

  •  9
  • Alexander Morland  · 技术社区  · 17 年前

    这是一个简单的javascript案例,它不断地询问“有没有?”就像一个四岁的孩子在开车…但是,就像父母一样,如果你经常这样做,或者同时有太多的孩子,服务器会在压力下发生故障。

    如何解决这样一个问题:拥有一个每5秒搜索一次新内容的网页,并且允许更多的访问者?

    10 回复  |  直到 17 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    StackOverflow是以某种方式做的,但不知道怎么做。

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

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

    我仍在等待一个好机会来利用它…

    哦,下面是StackOverflow的链接:
    Is there some way to PUSH data from web server to browser?

        2
  •  2
  •   pbrodka    17 年前

    在Java中,我使用慧星技术使用了Ajax库(DWR)——我认为应该使用PHP在PHP中搜索库。 其思想是,服务器正在发送一个非常长的HTTP响应,当它有东西要发送到客户机时,它会结束它,并用更新的数据发送新的响应。 使用IT客户机不需要每隔X秒对服务器执行ping操作来获取新数据——我认为这可以帮助您。

        3
  •  2
  •   monzee    17 年前

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

        4
  •  2
  •   philsquared    17 年前

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

    一个更复杂的旋转(可以包含Monzee的建议,根据客户机的数量而变化),将允许服务器在下一次投票之前规定时间间隔。然后,服务器可以随着时间的推移增加intervale,您甚至可以随时更改算法,或者响应网络负载。

        5
  •  1
  •   Anand    17 年前

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

        6
  •  1
  •   roenving    17 年前

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

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

        7
  •  0
  •   Pablo Cabrera    17 年前

    看看这个 link 它解释了各种Web远程处理技术

        8
  •  0
  •   Stefan    17 年前

    我将有一个调用数据库的实例,如果存在一个新的时间戳,将这个新的时间戳放在一个应用程序变量中。然后让所有会话对照该应用程序变量进行检查。或者类似的。这样,只有一个内部实例在调用SQL Server,客户机的数量无关紧要。

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

        9
  •  0
  •   Dave Sherohman    17 年前

    关于如何做到这一点,请注意,只有当您在“您的答案”框中键入时,它才不会连续检查新答案。

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

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

        10
  •  0
  •   Arnold Shore    17 年前

    我相信这种方法是基于服务器端套接字和客户端Ajax/Comet的组合。像:

    假设一个聊天应用程序有几个登录的用户,并且他们中的每个人都通过对服务器端侦听器脚本的慢速加载Ajax调用进行侦听。

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

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

    很高兴听到这里有想法的人。

    AS