我一直想知道如何使用PHP进行“真正的”(半)实时数据流传输。
可能的应用:聊天室,拍卖,游戏等
“真实”,我的意思是数据不只是写在某处并且不断轮询,而是以某种方式实际流式传输到客户端。
通过“半”,我的意思是,只有从服务器到客户端的流是实时的,并且从客户端到服务器的消息不是。
对于客户端和服务器之间的通信,我想坚持使用普通HTTP(AJAX)而不是其他协议。
通过手动刷新输出缓冲区,可以使用HTTP流式传输到客户端。
问题是如何将该脚本连接到服务器端?
一旦连接,就进行阻塞读取,而不是轮询更改。
共享内存(shmop)扩展可以工作,但它不是跨平台的。
或许memcached会起作用吗?但是我不确定是否有办法进行阻塞读取,所以它再次归结为轮询 - 虽然我确定memcached非常快,但我不喜欢连续轮询的想法。
有什么想法吗?
答案 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服务器,然后将消息传递给任何打开的连接。