更多浏览器可以从同一个PHP脚本的实例接收服务器事件吗?

时间:2016-07-08 10:07:45

标签: php server-sent-events

我想实现与多个房间的PHP聊天,但我不希望每个浏览器轮询服务器,而是我更喜欢服务器将更新发送给每个房间的所有用户。理想情况下,我只为每个房间运行一个PHP实例(当然还有用户发送的用于更新数据库的AJAX请求,我知道服务器端事件不受广泛支持):

  • 用户使用POST AJAX请求发送消息
  • 当一个房间的PHP脚本读取数据库并找到一条新消息时,它会将更新发送给连接到该房间的所有用户,这样它将更具响应性并且会减少对数据库通信的压力

所以基本上如果有N个用户和K个房间我想减少开销

N database/php poll requests every while

K database/php poll requests every while

2 个答案:

答案 0 :(得分:2)

您可以更好地使用Web套接字来实现此目的。如果你想使用php,那么有很少的库:

1)Ratchet

2)ReactPHP

3)d-Node

和其他人。我使用了Ratchet和React。他们工作得很好,就像我一样

答案 1 :(得分:1)

是的,但它需要编写自己的Web服务器:即PHP中的套接字服务器,用于接收来自客户端的http请求。然后,您只需为每个聊天室保留一个套接字阵列,当您收到要向所有侦听器广播的消息时,您可以创建并向每个客户端发送SSE消息,例如:

data: {room:12,msg:"Hello World"}\n\n

(我认为通过将套接字注册到多个数组中,您甚至可以使用单个SSE连接来侦听来自多个聊天室的消息。因此,您甚至可以使用单个PHP进程运行所有聊天室。)

但是,如果使用Apache + PHP,那么你想要的就是不可能。每个SSE连接都将获得专用的PHP进程。 (如果这是您唯一的选择轮询数据库非常昂贵,您可以让一个进程轮询数据库,然后将消息推送到内存中的本地主机数据库,并让每个PHP进程轮询内存数据库。)