我正在使用JAXL库来实现用php编写的jabber聊天机器人,然后使用PHP CLI将其作为后台进程运行。
事情很顺利,但我一直很难搞清楚如何在断开连接时重新连接聊天机器人!
我注意到,当我让它一直运行过夜时,它会掉落而不会再回来。我在jaxl_post_disconnect挂钩后尝试了$ jaxl-> connect()和$ jaxl-> startStream()以及$ jaxl-> startCore(),但我想我错过了什么。
答案 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编译。