【问题标题】:Reverse AJAX? Can data changes be 'PUSHED' to script?反向AJAX?数据更改可以“推送”到脚本吗?
【发布时间】:2010-11-18 06:50:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ajax asynchronous server-side server-push


    【解决方案1】:

    阅读Comet

    【讨论】:

    • 哇,我什至使用了相同的标语。这几乎令人尴尬。但是我最初对如何在 PHP 中执行此操作的搜索提到了无限循环脚本。是否必须在沿线某处发生无限循环才能使此类事情起作用?为什么实际更改的数据源(IMAP 服务器、数据库、txt 文件等)不能触发脚本唤醒并处理事情?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 2023-03-31
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2018-02-23
      相关资源
      最近更新 更多