【问题标题】:Rails: periodically use HEAD to check for page changesRails:定期使用 HEAD 检查页面更改
【发布时间】:2010-04-14 10:11:40
【问题描述】:

我有一个实现游戏的 Rails 应用程序,因此预计玩家会在游戏页面上保持浏览器处于打开状态。当玩家 Alan 自己采取行动时,我使用 AJAX 请求来更新 Alan 正在查看的游戏页面以反映新状态。但是,当另一个玩家(鲍勃)采取行动时,我没有(或不想要)一种机制来将改变推送到艾伦的观点。

我希望 Alan 的页面定期轮询 Rails 服务器以查找自上次重新加载以来是否有任何更改,如果没有则重新加载页面(通过整个页面 GET 或 AJAX 调用)。为了很好地使用缓存和代理,我想通过发出一个定期的 HTTP HEAD 请求来做到这一点,让 Rails 计算出最后一次更改的时间戳(可以从我的数据库中轻松获得)并在 Last -修改了标题;然后让客户端对该时间戳采取行动。

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby polling http-head


    【解决方案1】:

    你想要的很多东西都内置在 Rails 中。

    查看 Rails 缓存指南中的 Conditional GETS。

    如果你设置正确,这一切都只发生在浏览器和服务器之间。

    如果您非常热衷,您可以在 Rails 堆栈前面放置一个反向代理,并拥有一个额外的缓存层。

    【讨论】:

    • 整洁。该链接显示了服务器端需要做什么;如何让客户端发送适当的标头?
    • 等一下。哪个版本的 Rails 过时了?先入?我的服务器平台正在运行 Rails 2.1.0 并且无法升级(我不拥有它),并且 GamesController 似乎没有响应陈旧?或fresh_when
    • 啊...也许这是 2.3 的功能。也许早期版本有一个 etag 插件?
    • 另外:现代浏览器处理条件获取开箱即用。
    • 最后,我实现了自己的解决方案全布;但我即将搬到 Heroku,所以我可能会重新检查一下。
    【解决方案2】:

    我没有(或不想要)将更改推送给 Alan 的机制。

    你为什么不希望realtime updates 出现在其他玩家的视野中?

    您可以通过long polling AJAX 请求来实现这一点,例如ajaxmessaging 确实(做了?),或者如果 Flash 是您选择的武器,那么Juggernaut 可能是一个选项。 nginx_http_push_module 看起来也很有希望。公平地说,整个交易有点混乱,所以让我们希望能够以惊人的速度快速转向 HTML5 及其WebSockets。

    【讨论】:

    • 我知道 Comet - 但我不拥有运行我的服务器的硬件或上行链路。因此,我想降低 CPU / 内存占用率以及带宽。
    • 在这三个中,如果您选择基于 Comet 的解决方案,我只会将内存使用视为潜在问题。带宽使用量甚至可能会下降。
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2011-11-10
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多