PHP中(跨平台)实时数据流的最佳方法?

时间:2010-12-21 02:11:40

标签: php javascript push

我一直想知道如何使用PHP进行“真正的”(半)实时数据流传输。

可能的应用:聊天室,拍卖,游戏等

“真实”,我的意思是数据不只是写在某处并且不断轮询,而是以某种方式实际流式传输到客户端。

通过“半”,我的意思是,只有从服务器到客户端的流是实时的,并且从客户端到服务器的消息不是。

对于客户端和服务器之间的通信,我想坚持使用普通HTTP(AJAX)而不是其他协议。

通过手动刷新输出缓冲区,可以使用HTTP流式传输到客户端。

问题是如何将该脚本连接到服务器端?

一旦连接,就进行阻塞读取,而不是轮询更改。

共享内存(shmop)扩展可以工作,但它不是跨平台的。

或许memcached会起作用吗?但是我不确定是否有办法进行阻塞读取,所以它再次归结为轮询 - 虽然我确定memcached非常快,但我不喜欢连续轮询的想法。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

PHP不适合实现实时数据流。 PHP非常慢,并不是为构建多线程应用程序而设计的。你最好用Python或Java等语言实现一个完整的套接字服务器。

那就是说,我强烈建议您查看NodeJS: http://nodejs.org/

它为I / O使用基于异步事件的模型,而不是在事件循环中使用线程阻塞。 NodeJS服务器是用Javascript编写的。 NodeJS速度快,可扩展,学习曲线低。

客户端将使用长轮询Ajax请求连接到NodeJS HTTP服务器。 PHP可以直接连接到NodeJS并推送通知。或者PHP可以写入消息队列,数据库,内存缓存等,NodeJS会轮询这些数据存储以获取更新,并向客户端发送新消息。

在轮询更新时,您可能需要编写自己的守护进程,以便在从NodeJS到MySQL,memcached等之间进行操作。 NodeJS将使用守护进程保持套接字打开。守护进程将轮询数据存储以获取更新,并将更新发送到NodeJS。然后,NodeJS HTTP服务器将这些更新发送给客户端。

请参阅本教程以实现实时Twitter流: http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/

答案 1 :(得分:2)

如果您使用的是HTML和Javascript,那么您需要WebSockets。如果它是Flash或其他任何东西,那么正常的TCP套接字。

要么是你运行一个等待连接的服务器文件(用PHP编写)。一旦它连接到一个或多个客户端,就可以双向推送数据。那里有一些PHP WebSocket项目。看看这个:

http://code.google.com/p/phpwebsocket

还有一个名为Skeleton的框架,我一直在为它构建一个内置的WebSocket服务器库。但仍然处于不稳定的阶段。

http://code.google.com/p/skeleton

不幸的是,WebSockets仍然是一项新技术,因此它们不受普遍支持。正如@Christian所提到的,您可能想要使用Socket.IO库。

答案 2 :(得分:0)

如果您想在PHP和另一种语言(例如C ++应用程序)之间进行通信,您可能需要查看Apache Thrift(http://thrift.apache.org/)。 Apache Thrift在Facebook上被广泛用于“可扩展的跨语言服务开发”。

编辑:我可能会使用Apache Thrift与在端口80上侦听的Twisted应用程序通信,并让浏览器使用长轮询或websocket连接到Twisted应用程序。您可能还需要查看Socket.IO,这是一个跨浏览器的Web套接字实现,它是为实时应用程序而设计的。

基本上,您可以使用Thrift将应用程序推送到Twisted Web服务器,然后将消息传递给任何打开的连接。

  • 基督教