Php 如何向websocket用户发送AJAX消息
我已经在Websockets中实现了实时聊天,它就像一个魔咒。我和AJAX轮询(以前就存在)一起做了,因为我不想删除对旧浏览器的AJAX轮询支持,所以尽管WebSocket将是首选,但我仍将轮询作为一种选择 设置websocket代码的方法是:Php 如何向websocket用户发送AJAX消息,php,ajax,websocket,ratchet,Php,Ajax,Websocket,Ratchet,我已经在Websockets中实现了实时聊天,它就像一个魔咒。我和AJAX轮询(以前就存在)一起做了,因为我不想删除对旧浏览器的AJAX轮询支持,所以尽管WebSocket将是首选,但我仍将轮询作为一种选择 设置websocket代码的方法是: 使用WebSocket将消息发送到相应的连接 将消息记录到数据库中 AJAX发送的工作方式是: 将消息记录到数据库中 AJAX轮询的工作方式是: 检查用户上次检索某个房间的邮件的时间,并检索此后的所有邮件 我有一个更多的概念性问题,关于如何让
- 使用WebSocket将消息发送到相应的连接
- 将消息记录到数据库中
- 将消息记录到数据库中
- 检查用户上次检索某个房间的邮件的时间,并检索此后的所有邮件
- 用户A通过websocket发送消息
- 聊天信息被发送到所有相关连接。在本例中,它只是回显给用户A,因为用户B没有使用WebSocket
- 聊天信息被登录到数据库
- 用户B请求新消息,用户A的消息被发送回给他
- 用户B通过AJAX发送消息
- 消息被保存在数据库中
- ?
当您将消息保存到数据库中时,也可以将其推送到Websocket客户端。感谢您提供了一些有关如何处理此问题的想法。这就是我最后做的: 我让我的JS客户端每隔几秒钟ping一次服务器。对于AJAX用户来说,这更频繁,因为他们需要轮询消息。对于Websocket用户,他们不需要轮询Websocket消息,所以他们每隔15秒轮询一次“签入”。这样做的好处是基本上为每个客户机提供了一个无限循环,这正是这个想法所需要的 我所做的就是在
messages
表中添加一列,跟踪消息源:0
用于AJAX,1
用于WebSocket。然后,我修改了一个函数,该函数检索消息以接受$ajaxOnly
参数。当我在AJAX民意测验中调用它时,它是false
。对于websocket民意测验,我将其称为true
。结果是对于用户所在的所有房间,它轮询数据库并检查是否有任何新的AJAX消息。如果有,它会将它们发送回客户端
有两个注意事项:
- 消息将出现错误。Websocket消息是实时中继的,因此在Websocket消息之前发送的AJAX消息对另一个AJAX用户显示得更早,但对其他Websocket用户显示得更晚
- 这不是实时的。它和轮询间隔一样慢,在我的例子中,WebSocket的轮询间隔是15秒,因为轮询非常密集。AJAX轮询更为频繁,因为它们需要更为频繁才能获取任何消息
如果你希望得到一个实时解决方案(就像我一样),你会对此感到失望,但这至少是一个可行的解决方案,所以我一直采用它,直到出现更好的解决方案。您可以通过增加客户端ping服务器的频率使其接近实时。OK。。。但是怎么做呢?这就是我想弄明白的。“把它推给Websocket客户端”…显然是的。这个问题的全部要点是找出如何做到这一点的实用性。我不知道你使用的是什么服务器以及它是如何工作的。我今天已经用nodejs-WS实现了一个WS-Server。在这里,它的工作原理与客户端->所有客户端消息相同。您只需触发“发送”;)应该是ws-Server最基本的功能-server@MRonline这是在使用PHP,不是nodeJS,而是语言不可知,对于传入的与websocket连接没有连接的AJAX消息,您会如何建议这样做?另外,我很抱歉,但您真的认为这一行回答是“试图帮助”吗?它是如此的琐碎,以至于作为一个评论几乎没有什么用处。一个像样的答案会告诉你怎么做,但你似乎比我或OP更不知道怎么做。至少我的评论(在主线上)包含了一些实际的想法,而不是一句陈词滥调的话,它只是陈述了显而易见的事实