使用服务器推送在复杂页面中进行多用户编辑

时间:2011-11-15 23:10:31

标签: php zend-framework server-push

我正在将Zend Framework用于名为Pricetag的应用程序,我们正在考虑添加对实时多用户编辑的支持。基本上,我们的目标是,在4个步骤中,您可以与其他在线用户分享您正在编辑的内容(非常像Pivotal TrackerTrello)。

这是我们所拥有的四个页面中最复杂(以编程方式说)的屏幕截图:

Pricetag Step 2 screenshot

内部HTML并不重要(但是,如果你想检查它,你可以注册为免费用户),基本上是一些输入和添加/删除这些块(“可交付成果”和“任务”)的能力的JavaScript。

我认为我需要一些方法让服务器通知每个在线客户端页面的变化。我每次更改时都会发出请求(每次更新时右侧的白色块都会更新),但我不确切知道其他用户将如何接收这些信息。

每隔5秒左右轮询一次服务器似乎非常错误。该网站使用PHP,是否足以做到这一点?我应该与服务器中的单独脚本连接吗?是否已经构建了一个Zend Framework模块,即使我先问Google,我仍然缺少这个模块?

4 个答案:

答案 0 :(得分:6)

试试这个彗星服务器 - http://dklab.ru/lib/dklab_realplexor/

它有PHP和javascript API,请参阅沙箱中的示例 - http://rutwit.ru/realplexor/demo

使用perl编写的Comet服务器,源代码和tarball文件可在此处获取 - http://github.com/DmitryKoterov/dklab_realplexor/tarball/master

参见其他技术 -

Tornado Web Server。 Web服务器在Python上编写,它不仅仅是彗星服务器 - 它是一个可以创建彗星服务器的框架。

NginxHttpPushModule:nginx web服务器的简单模块,增加了对Comet的支持。

CometD:使用Ajax Push的可扩展的基于HTTP的事件路由总线。支持许多渠道的订阅。

APE:这是构建彗星系统而不是成品的框架。

Stardust - perl中的简单COMET服务器(作者评论 - “我能想象的最简单的COMET服务器”)。

Orbited:在JavaScript中模拟TCP套接字。

答案 1 :(得分:2)

看看socket.io图书馆。它使用一堆技术异步通知客户端。

答案 2 :(得分:1)

我们前一段时间尝试使用Comet作为聊天客户端。基本前提是您打开一个连接(可能是一个AJAX请求)到Web服务器并保持打开直到

  • 超时到期(比如说30秒),
  • 发生
  • 或某些需要将数据发送到客户端的应用程序状态。

此时,请求返回。如果有有效负载,则应用需要完成的任何操作,然后再次发出请求以启动该过程。

我们遇到的唯一主要缺点是许多连接被打开(只是坐在那里等待响应)我们很快就耗尽了Apache中的线程数,而未来的连接则停滞不前。那时我们放弃了练习(但出于其他原因),所以从未考虑过可能的修复。

另一个挑战是让单独的PHP线程互相交流,这同样不是一件容易的事。我记得我们最终使用了基于套接字构建的东西,并且每个线程可以与另一个线程交换给定一个唯一的ID(我自己没有在这个位上工作,所以我不确定这是否完全正确)。在您的情况下,您可以检查数据库或文件上的模拟时间,然后在发生修改时返回。

我可以想象,自从我们尝试这个问题(几年前)以来,情况会有所进展,但我怀疑这个概念仍然存在,图书馆已经利用了这一点。

答案 3 :(得分:0)

许多“推送”库实际上每隔几秒恢复一次轮询服务器。

我们实施了一个聊天脚本来保持打开连接,但最终出现了一些客户及其防火墙的问题。我不会再这样做了。如果保持连接打开,请不要在端口80上使用HTTP。

这也是PHP脚本的问题。每隔几秒钟对每个客户端执行一次数据库查询可能会很慢。我们通过编写一个静态HTML文件来避免这种情况,ajax每隔几秒就会轮询一次更改。大多数时候服务器报告未更改(301?)。这对服务器来说是一个很小的负载,并且经常被HTTP Keep-alive进一步微分。如果您仍然认为无法加载服务器,也可以租用网站空间来托管静态文件。