Php 如何向websocket用户发送AJAX消息

Php 如何向websocket用户发送AJAX消息,php,ajax,websocket,ratchet,Php,Ajax,Websocket,Ratchet,我已经在Websockets中实现了实时聊天,它就像一个魔咒。我和AJAX轮询(以前就存在)一起做了,因为我不想删除对旧浏览器的AJAX轮询支持,所以尽管WebSocket将是首选,但我仍将轮询作为一种选择 设置websocket代码的方法是: 使用WebSocket将消息发送到相应的连接 将消息记录到数据库中 AJAX发送的工作方式是: 将消息记录到数据库中 AJAX轮询的工作方式是: 检查用户上次检索某个房间的邮件的时间,并检索此后的所有邮件 我有一个更多的概念性问题,关于如何让

我已经在Websockets中实现了实时聊天,它就像一个魔咒。我和AJAX轮询(以前就存在)一起做了,因为我不想删除对旧浏览器的AJAX轮询支持,所以尽管WebSocket将是首选,但我仍将轮询作为一种选择

设置websocket代码的方法是:

  • 使用WebSocket将消息发送到相应的连接
  • 将消息记录到数据库中
AJAX发送的工作方式是:

  • 将消息记录到数据库中
AJAX轮询的工作方式是:

  • 检查用户上次检索某个房间的邮件的时间,并检索此后的所有邮件
我有一个更多的概念性问题,关于如何让这两个人互相合作。假设我有用户A和用户B。如果用户A和用户B都使用AJAX轮询,或者都使用WebSocket,则不会出现任何问题。正如你所期望的那样。但以用户A使用WebSocket,用户B使用AJAX轮询为例

A→ B

  • 用户A通过websocket发送消息
  • 聊天信息被发送到所有相关连接。在本例中,它只是回显给用户A,因为用户B没有使用WebSocket
  • 聊天信息被登录到数据库
  • 用户B请求新消息,用户A的消息被发送回给他
B→ A

  • 用户B通过AJAX发送消息
  • 消息被保存在数据库中
  • ?
这就是我挂断电话的原因。Websocket->AJAX用户消息之所以有效,是因为消息最终会出现在数据库中,AJAX用户可以在数据库中对其进行轮询。但是websocket用户根本不轮询数据库,因此来自AJAX用户的消息无法进入管道。目前,websocket用户看不到来自AJAX用户的任何消息。他们只有在重新加载整个页面时才能看到它们,此时所有消息都直接从数据库中检索

什么是允许AJAX用户的消息通过websocket发送给相关websocket用户的合适方法?基本上,我如何在另一个方向上沟通

在这个主题上,我能找到的唯一一件事是——然而,我没有使用longpolling,我也不完全确定向websocket应用程序“提供它”意味着什么。这是否意味着websocket服务器有责任检查新的AJAX消息?是否无法将AJAX脚本“推送”到websocket服务器?

简单解决方案:
当您将消息保存到数据库中时,也可以将其推送到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轮询更为频繁,因为它们需要更为频繁才能获取任何消息
这不是一个完美的解决方案,但它确实实现了允许AJAX消息以近乎实时的方式显示给websocket用户的目标。对我来说,我想完全支持AJAX和WebSocket,但AJAX更注重兼容性,理想情况下大多数人都会使用WebSocket,因此这不是一个很好的解决方案这一事实与我无关,因为它确实完成了工作


如果你希望得到一个实时解决方案(就像我一样),你会对此感到失望,但这至少是一个可行的解决方案,所以我一直采用它,直到出现更好的解决方案。您可以通过增加客户端ping服务器的频率使其接近实时。

OK。。。但是怎么做呢?这就是我想弄明白的。“把它推给Websocket客户端”…显然是的。这个问题的全部要点是找出如何做到这一点的实用性。我不知道你使用的是什么服务器以及它是如何工作的。我今天已经用nodejs-WS实现了一个WS-Server。在这里,它的工作原理与客户端->所有客户端消息相同。您只需触发“发送”;)应该是ws-Server最基本的功能-server@MRonline这是在使用PHP,不是nodeJS,而是语言不可知,对于传入的与websocket连接没有连接的AJAX消息,您会如何建议这样做?另外,我很抱歉,但您真的认为这一行回答是“试图帮助”吗?它是如此的琐碎,以至于作为一个评论几乎没有什么用处。一个像样的答案会告诉你怎么做,但你似乎比我或OP更不知道怎么做。至少我的评论(在主线上)包含了一些实际的想法,而不是一句陈词滥调的话,它只是陈述了显而易见的事实