我一直想知道如何用PHP实现“真正的”(半)实时数据流。
可能的应用:聊天室、拍卖、游戏等。
所谓“真”,我的意思是数据不只是在某个地方写入并连续轮询,而是以某种方式实际上流向了客户端。
所谓"semi",我的意思是,如果只有从服务器到客户端的流是实时的,而从客户端到服务器的消息不是实时的,这是可以的。
对于客户机和服务器之间的通信,我更喜欢使用纯HTTP (AJAX),而不是其他协议。
通过手动刷新输出缓冲区,可以使用HTTP流式传输到客户端。
问题是在服务器端将该脚本连接到什么?
一旦连接上,就会进行阻塞读取,而不是轮询更改。
共享内存(shmop)扩展可以工作,但它不是跨平台的。
也许memcached可以工作?但我不确定是否有一种方法可以进行阻塞读取,所以它又归结为轮询-尽管我确信memcached相当快,但我只是不喜欢连续轮询的想法。
有什么想法吗?
发布于 2011-01-11 12:06:39
PHP不太适合实现实时数据流。PHP非常慢,并且不是为构建多线程应用程序而设计的。最好用Python或Java这样的语言实现一个完全成熟的套接字服务器。
也就是说,我强烈推荐查看NodeJS:http://nodejs.org/
它使用基于异步事件的I/O模型,而不是让线程在事件循环中阻塞。NodeJS服务器是用Javascript编写的。NodeJS速度快,可伸缩性强,并且学习曲线较低。
客户端将使用长轮询Ajax请求连接到NodeJS HTTP服务器。PHP可以直接连接到NodeJS并推送通知。或者PHP可以写入消息队列、数据库、memcache等,NodeJS将轮询这些数据存储以获取更新,并向客户端发送新消息。
在轮询更新时,您可能需要编写自己的守护进程来充当从NodeJS到MySQL、memcached等的切换。NodeJS将通过守护进程保持套接字打开。守护进程将轮询数据存储以获取更新,并将更新发送到NodeJS。然后,NodeJS HTTP服务器会将这些更新发送给客户端。
有关实现实时Twitter流的信息,请参阅以下教程:http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/
发布于 2010-12-21 10:18:04
如果你使用的是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库。
发布于 2010-12-21 10:18:41
如果您希望在PHP和另一种语言(例如,C++应用程序)之间进行通信,则可能需要研究Apache Thrift (http://thrift.apache.org/)。Apache Thrift在Facebook中被广泛用于“可伸缩的跨语言服务开发”。
编辑:我可能会使用Apache Thrift与监听端口80的Twisted应用程序通信,并使用长轮询或websocket将浏览器连接到Twisted应用程序。你可能还想看看Socket.IO,它是一个跨浏览器的web套接字实现,是为实时应用程序设计的。
基本上,您将使用Thrift将您的应用程序推送到您的Twisted web服务器,然后将消息传递到任何打开的连接。
https://stackoverflow.com/questions/4495749
复制相似问题