6

我注意到我的一些 ajax-heavy 网站(我访问的网站,不是我建立的网站)具有某些自动刷新功能。例如,在 GMail 中,如果我收到一条新消息,我会在没有重新加载页面的情况下看到新消息。Facebook 基于浏览器的 IM 客户端也是如此。据我所知,没有任何 java 小程序处理服务器-浏览器绑定,所以我只能假设它是由 AJAX 完成的,也许是我不知道的一些元素。所以根据我的最佳猜测,它是通过以下两种方式之一完成的:

  1. javascript 对服务器端脚本进行稳定的“ping”,检查可能可用的任何更新(这可以解释为什么其中一些页面会导致任何其他重型页面爬行)。或者

  2. javascript 处于闲置状态,服务器端脚本实际上将任何更新“推送”到浏览器。但我不确定这是否可能。我想有某种 AJAX 功能仍然 ping,但它只是询问“任何更新?” 并且服务器脚本有一个简单的布尔值,表示“不”或“我很高兴你问了”。但如果是这种情况,任何数据更改都需要直接调用脚本,以便它准备好数据更改并对布尔函数进行更改。

那么这可能/可行/它是如何工作的?我想像:

有人向服务器发送电子邮件/IM/DB 更新,服务器使用脚本的 URL 加上一些相关的 GET 变量调用脚本,脚本记录更改并更新“可用更新”变量,AJAX 得到响应实际上更新,AJAX 运行其正常的“更新页面”功能,执行正常的更新脚本并将它们输出到浏览器。

我之所以问,是因为 js 只是在进行持续检查似乎效率很低,这需要 a) 服务器每 1.5 秒工作一次,b) 我的浏览器每 1.5 秒工作一次,这样我就可以说“哦,男孩,我有一个 IM!就像一个真正的 IM 客户端一样!”

4

2 回答 2

6

阅读彗星

于 2009-08-10T12:39:56.423 回答
0

我实际上一直在开发一个小型 .NET Web 应用程序,它使用 Ajax 和所描述的长轮询技术。

根据您使用的技术,您可以使用线程信号机制来保留您的请求,直到检索到更新。使用 ASP.NET,我在一台机器上运行我的服务器,因此我存储了对我的 Producer 对象的引用(它包含一个处理数据的线程)。为了启动数据拉取,我的服务的订阅方法被调用,它创建了一个向生产者注册的消费者对象。如果 Consumer 是长轮询模式,它有一个 AutoResetEvent ,每当它接收到新数据时都会发出信号,并且每当 Web 客户端请求数据时,Consumer 首先等待重置事件,然后返回它。

但是你提到了一些关于 PHP 的东西——据我所知,持久性是通过序列化来维护的,而不是实际上将对象保存在内存中,所以我不知道你如何使用 $_CACHE[] 或 $_SESSION[ 来引用 Producer 对象]。当我在 PHP 中开发时,我对多线程一无所知,所以我没有玩弄它,但我想你可以研究一下。

使用无限循环会消耗大量的处理能力——我会先用尽所有其他选项。

于 2009-08-17T17:35:28.553 回答