我注意到我的一些重型网站(我访问的网站,而不是我建的网站)都有一些自动刷新功能。例如,在GMail中,如果我收到新消息,我会看到没有页面重新加载的新消息。基于Facebook浏览器的IM客户端也是如此。据我所知,没有任何java applet处理服务器 - 浏览器绑定,所以我只能假设它是由AJAX完成的,也许是一些我不知道的元素。所以按照我的最佳猜测,它是以两种方式之一完成的:
javascript对服务器端脚本进行稳定的“ping”,检查可能有的任何更新(这可以解释为什么其中一些页面会抓取任何其他重型页面)。或
javascript无所事事,服务器端脚本实际上“推送”了对浏览器的任何更新。但我不确定这是否可行。我想有些类型的AJAX函数还在ping,但它只是简单地问“任何更新?”并且服务器脚本有一个简单的布尔值,表示“nope”或“我很高兴你问。”但如果是这种情况,任何数据更改都需要直接调用脚本,以便它准备好数据更改并对该布尔函数进行更改。
那可能/可行/它是如何工作的?我想象的是:
有人向服务器发送电子邮件/ IM / DB更新,服务器使用脚本的URL和一些相关的GET变量调用脚本,脚本记录更改并更新“可用更新”变量,AJAX获取响应实际上有更新,AJAX运行其正常的“更新页面”功能,执行正常的更新脚本并将它们输出到浏览器。
我问,因为js只是做一次常量检查似乎非常低效,这需要a)服务器每1.5秒做一次工作,而b)我的浏览器每1.5秒做一次工作只是为了我的结束可以说“噢,小伙子,我有一个IM!就像一个真正的IM客户端!”
答案 0 :(得分:6)
了解Comet
答案 1 :(得分:0)
我实际上一直在使用一个小型的.NET Web App,它使用了描述长轮询技术的Ajax。
根据您使用的技术,您可以使用线程信号机制来保存您的请求,直到检索到更新。 使用ASP.NET我在一台机器上运行我的服务器,所以我存储了一个对我的Producer对象的引用(它包含一个处理数据的线程)。要启动数据提取,将调用我的服务的Subscribe方法,该方法将创建一个在Producer中注册的Consumer对象。如果Consumer是长轮询模式,它有一个AutoResetEvent,只要它接收到新数据就会发出信号,每当Web客户端发出数据请求时,Consumer首先等待reset事件,然后返回它。
但是你提到了一些关于PHP的东西 - 据我所知,持久化是通过序列化来维护的,而不是实际上将对象保留在内存中,所以我不知道如何使用$ _CACHE []或者引用Producer对象或$ _SESSION []。当我用PHP开发时,我从未真正了解多线程,所以我没有玩过它,但我想你可以调查一下。
使用无限循环将消耗大量的处理能力 - 我会首先耗尽所有其他选项。