强制使用JACK / XMPPHP进行的聊天机器人在断开连接时重新连接

时间:2012-01-28 00:24:53

标签: php xmpp xmpphp

我正在使用JAXL库来实现用php编写的jabber聊天机器人,然后使用PHP CLI将其作为后台进程运行。

事情很顺利,但我一直很难搞清楚如何在断开连接时重新连接聊天机器人!

我注意到,当我让它一直运行过夜时,它会掉落而不会再回来。我在jaxl_post_disconnect挂钩后尝试了$ jaxl-> connect()和$ jaxl-> startStream()以及$ jaxl-> startCore(),但我想我错过了什么。

3 个答案:

答案 0 :(得分:1)

一种解决方案是测试您的连接:

1) making a "ping" request to your page/controller or whatever
2) setTimeout(functionAjaxPing(), 10000);
3) then read the Ajax response and if == "anyStringKey" then your connection works find
4) else: reconnect() / errorMessage() / whatEver()

这就是我认为的IRC聊天用途。

但是这会产生更多的流量,因为需要ping / ping请求。

跳这会对你有所帮助。 :)

答案 1 :(得分:1)

如果您使用的是Jaxl v3.x,则只需添加on_disconnect event的回调即可。

此外,您必须使用XEP-0199 XMPP Ping。 XEP将做的是,定期向连接的jabber服务器发送XMPP ping。它还将接收服务器ping并发回所需的pong数据包(例如,如果您的客户端没有回复服务器ping,jabber.org将在一段时间后丢弃您的连接)。

最后你还必须使用空白ping。空白ping是发送到服务器的单个空格字符。这通常足以使NAT设备认为连接“活着”,并且同样对于某些Jabber服务器,例如,开火。它还可能使操作系统更快地检测到丢失的连接 - 没有数据发送或接收的TCP连接与丢失的连接无法区分。

答案 2 :(得分:0)

我最终做的是创建一个只重新执行PHP脚本的crontab。

在PHP脚本中,我读了最后一个fork的pid的特定文件。如果存在,脚本会尝试终止它。然后脚本使用pcntl_fork()来分叉进程(这对于守护PHP脚本非常有用)并将新PID捕获到文件中。然后,fork会按照常规使用JAXL登录Jabber。

在与JAXL的作者交谈后,很明显这是最简单的方法,尽管是hacky。然而,作者可能在最近的迭代中研究了这个特定的缺陷。

这个特定方法的一个缺陷是它需要pcntl_fork(),默认情况下不用PHP编译。