PHP 闲聊:如果我登录并检查消息并断开连接,在其他用户端我将显示为已断开连接
题
我不确定我所做的是否绝对正确。但这里是这样的:
- 用户通过基于网络的界面登录聊天
- 用户通过 Comet 收到更新通知
- 用户输入转到 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 本身是一种解决方法,以避免在传输数据时无法保持连接。
其他提示
据我所知,问题在于另一端的 Jabber 用户何时响应。那里的问题,至少部分是,用户正在响应 Jabber 服务器上的另一个用户,但您希望 php 脚本知道该响应已经发生,而无需保持连接打开(这是有道理的,因为脚本可能不再运行)。
一种选择,尽管非常愚蠢,是:
有一个 php 脚本,可以代理与 Jabber 服务器的连接,以便为页面上的用户发送和接收,
使用AJAX为用户发送消息(AJAX会指向上面的脚本,脚本会发送消息。)
有一个 Javascript 无限循环,每隔 10 秒左右对同一个脚本执行 ping 操作,检查是否有消息。如果有,它们将被传递回客户端并输出给用户。
上面的问题只有两个:
1)如果传输消息时用户未连接,php脚本是否仍然会看到/获取消息?
2) 每 3 秒发出一次 ajax 请求的客户端循环可能会消耗巨大的资源。
解决方案2:
开火 贾伯服务器。它带有内置的网络聊天客户端,并且有一个名为 Fastpath 的插件,旨在处理客户端上基于 HTML 的聊天(例如太多支持页面上的“立即与代理聊天!”功能。)
我们在工作中使用它,它是非常可定制的,可以与其他脚本集成(例如,如果您想要一个脚本从登录中填写用户详细信息,或添加一些自定义头像,或其他什么),并且它(OpenFire )有大量其他扩展和插件,如果这不是您想要的,它们可能有您正在寻找的东西。