如何使用flex 3和php获得“长轮询”?

时间:2009-12-09 17:59:33

标签: php flex3 server-push

我正在为客户开发一个项目,他们的cms将是flex 3和php。将有多个客户同时使用它,我试图将其转移到一个人做出改变的地方,其他人会看到它。

我的问题是:如果我使用的是Flex 3和PHP,我该如何实现类似'server-push'的功能。长期投票是一个可能/好的选择吗?或者还有其他选项可以帮助我完成同样的任务吗?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

长轮询(又名AJAX Comet)和PHP的问题在于PHP缺乏真正使其成为可能的线程架构。许多其他传统语言的构建是为了获得请求并以串行方式快速响应。

新语言正在逐步完全支持这一概念。实际上,您确实需要一个使用EPOLL(基于事件/异步套接字IO)和/或微线程连接处理的框架和Web服务器,这样您就可以同时处理数千个打开的连接,而无需为每个连接专用一个完整的操作系统线程。打开连接命中你的服务器。 (操作系统线程资源有限)

我做了一个关于解释AJAX Comet / Long轮询概念的视频。您可以在此处查看更多信息:http://www.youngtechstars.com/?p=466

现在......我确实创建了非常简单的概念证明,以便用PHP进行长轮询。它需要使用自定义NGINX mod。首先,请求将进入NGINX服务器,该服务器将请求发送到PHP进程(使用FastCGI)。如果我希望连接保持打开状态,我会返回一个带有自定义HTTP标头的响应(在本例中为“X-NGINX-WAIT-UNTIL-KEY:a10x39”或其他内容)。这将指示NGINX保持连接并且还没有向用户返回响应。稍后我会在数据准备好并传入密钥时从PHP(或其他进程)打开一个回退到NGINX的套接字。执行此操作会导致NGINX执行第二个请求,并在内部使用相同的请求再次点击PHP进程以获取用户的响应。这是一个概念证明,并且完美无缺,但我从未发布它。此模型在群集Web环境中存在问题,因为您必须跟踪具有打开连接的服务器。

Flex,就像在普通旧javascript中执行XmlWebRequest一样,对于长轮询没有任何问题,因为请求是异步处理的。

有许多框架可以支持这种开箱即用:

  • Jetty WebServer - 一个纯Java Web服务器,它使用continuation和非阻塞IO(java.nio)来支持大量的开放连接。
  • XEP-0206: XMPP Over BOSH - XMPP(Jaber)的HTTP Binding / Bosh系统规范
  • ApacheMQ(消息队列) - AJAX Comet / HTTP长轮询页面
  • liberator - 为AJAX Comet构建的商业网络服务器
  • lightstreamer - 为AJAX Comet和HTTP Streaming构建的商业Web服务器