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

min*_*.dk 7 javascript php push

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

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

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

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

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

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

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

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

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

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

有任何想法吗?

Sim*_*ian 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/

  • 你错误的PHP很慢.但我必须同意,它可能不是为这种类型的并行/多线程应用程序设计的.接受了答案. (7认同)
  • 关于"错误的PHP缓慢"的+1.不是.它确实在线程方面存在局限性,并且它绝对不是针对持久连接而定制的,但它并不慢. (2认同)