无需持续轮询的实时 Twitter 流
Posted
技术标签:
【中文标题】无需持续轮询的实时 Twitter 流【英文标题】:Real Time Twitter Streaming without constant Polling 【发布时间】:2010-04-15 15:04:52 【问题描述】:我正在查看 Twitter Streaming API 以获取实时信息。 但我不希望它存储在我的服务器上。 我只希望它从服务器中提取,浏览器页面将从我服务器的 twitter 拉取 URL 中检索数据。 但我想避免每隔几毫秒轮询一次我的服务器。 有没有办法让我的服务器脚本继续推送到我的浏览器页面?
【问题讨论】:
(相关) blog.persistent.info/2009/08/twitter-pubsubhubbub-bridge.html 【参考方案1】:你想要怎样的生活?有多种方法可以设置套接字,但它们可能相当复杂,并且仍会消耗它们应有的带宽份额。
是否可以每 5、10 秒左右轮询一次?每隔几毫秒就会给你一个相当不错的“实时”结果,但如果你的网站上出现一些东西需要几秒钟的时间,我不会作为用户感到不安。这对我来说将是令人满意的“生活”。
【讨论】:
我同意。在上一个请求之后轮询 1 秒仍然可以。您只需要为每个请求发送一个日期/时间戳,这样您的服务器就只会回复最新的推文以保持速度。【参考方案2】:查看COMET。
In web development, Comet is a neologism to describe a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it.
我一直想尝试这种方法,但一直没有尝试:
隐藏的 IFrame
动态 Web 应用程序的一项基本技术是使用隐藏的 IFrame HTML 元素(内联框架,它允许网站将一个 HTML 文档嵌入到另一个 HTML 文档中)。这个不可见的 IFrame 作为分块块发送,隐含地声明它为无限长(有时称为“永久帧”)。随着事件的发生,iframe 逐渐被脚本标签填充,其中包含要在浏览器中执行的 javascript。由于浏览器以增量方式呈现 HTML 页面,因此每个脚本标签都会在收到时执行。[8]
IFrame 方法的一个好处是它适用于所有常见的浏览器。这种技术的两个缺点是缺乏可靠的错误处理方法,以及无法跟踪请求调用进程的状态。[8]
【讨论】:
"Hidden IFrame" obviously.com/tech_tips/slow_load_technique 我在 php 中尝试过这个并在 FF 和 Opera 中工作。这在 IE6 和 Chrome 中不起作用,只是对此进行了测试。 <?php for ($i = 0; $i < 10; $i++) echo $i."<br/>";冲洗();睡眠(1); ?>
啊,看起来 chrome 在将数据交给堆栈之前缓冲了 256 个字节。因此,您需要在 php 代码 echo()s 和 flush()es 之前分块(发送)至少 256 个字节。
还有一点:缓冲区适用于 COMET 的 (i)frame 和 XHR (ajax) 技术。以上是关于无需持续轮询的实时 Twitter 流的主要内容,如果未能解决你的问题,请参考以下文章
如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?