PHP 闲聊:如果我登录并检查消息并断开连接,在其他用户端我将显示为已断开连接

StackOverflow https://stackoverflow.com/questions/847854

  •  21-08-2019
  •  | 
  •  

我不确定我所做的是否绝对正确。但这里是这样的:

  1. 用户通过基于网络的界面登录聊天
  2. 用户通过 Comet 收到更新通知
  3. 用户输入转到 PHP 文件的详细信息,该文件进一步连接到 Jabber 服务器

现在的问题是,当用户想要发送消息时,很简单,运行 php,在其中连接到 jabber 服务器并发送消息。当我等待消息时,问题出现了。因为如果我登录并检查消息并断开连接,在其他用户端我将显示为已断开连接。

我是否以错误的方式处理这个问题?我应该直接连接到 Jabber 服务器(通过 javascript)而不是中间的 PHP 层吗?如何通过PHP接收消息?

有帮助吗?

解决方案

这是 http 的固有问题(或功能) - 没有持久的连接(不是真的)。你需要一个解决方法,没有真正的解决方案。

你可以用java或flash来做到这一点,但这并不是很好(javascript 4tw!)。

另一种可能性是创建一个中间客户端,将浏览器和网络服务器之间的连接转换为网络服务器和 jabber 服务器之间的连接。 混乱,但有可能。

或者也许有一个 API 可以帮助解决这个问题。

通过javascript直接连接到jabber服务器
我可能睡过了最新的ajax发明,但据我所知,你只能与源html文件来自的主机进行通信(忽略greasmonkey和插件)。 没有不同的域,没有不同的端口,期间。 除非您要教您的 jabber 服务器如何向浏览器提供 chatpage-html,否则这会出现问题。此外,保持联系甚至不起作用,因为这需要多部分响应。这些仅受 mozilla 支持,并且 这就是丑小鸭彗星存在的原因。 comet 本身是一种解决方法,以避免在传输数据时无法保持连接。

其他提示

我还没有尝试过,但你可能想看看 xmpphp. 。其次,您可能需要考虑让用户在登录您的网站时保持登录 XMPP 服务器(也称为 Jabber 服务器)。您可能希望有某种超时,以防他们离开您的网站并且不再回来。

至于是否应该通过 JavaScript 连接,我不明白为什么不能。我建议您选择对您来说最简单的方式。您可能想查看 节节, ,对于这种情况,我听到了一些好消息。

我广泛使用的唯一 XMPP 库是 琴头, ,但这需要使用 Python卡马埃利亚.

据我所知,问题在于另一端的 Jabber 用户何时响应。那里的问题,至少部分是,用户正在响应 Jabber 服务器上的另一个用户,但您希望 php 脚本知道该响应已经发生,而无需保持连接打开(这是有道理的,因为脚本可能不再运行)。

一种选择,尽管非常愚蠢,是:

  • 有一个 php 脚本,可以代理与 Jabber 服务器的连接,以便为页面上的用户发送和接收,

  • 使用AJAX为用户发送消息(AJAX会指向上面的脚本,脚本会发送消息。)

  • 有一个 Javascript 无限循环,每隔 10 秒左右对同一个脚本执行 ping 操作,检查是否有消息。如果有,它们将被传递回客户端并输出给用户。

上面的问题只有两个:

1)如果传输消息时用户未连接,php脚本是否仍然会看到/获取消息?

2) 每 3 秒发出一次 ajax 请求的客户端循环可能会消耗巨大的资源。

解决方案2:

开火 贾伯服务器。它带有内置的网络聊天客户端,并且有一个名为 Fastpath 的插件,旨在处理客户端上基于 HTML 的聊天(例如太多支持页面上的“立即与代理聊天!”功能。)

我们在工作中使用它,它是非常可定制的,可以与其他脚本集成(例如,如果您想要一个脚本从登录中填写用户详细信息,或添加一些自定义头像,或其他什么),并且它(OpenFire )有大量其他扩展和插件,如果这不是您想要的,它们可能有您正在寻找的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top