1

私は JAXL ライブラリを使用して、php で記述された jabber チャット ボットを実装しています。これは、PHP CLI を使用してバックグラウンド プロセスとして実行されます。

うまく機能していますが、切断時にチャットボットを再接続する方法を理解するのに苦労しています!

一晩放置すると、時々落ちて戻ってこないことに気づきました。$jaxl->connect() と $jaxl->startStream()、および jaxl_post_disconnect フックの後に $jaxl->startCore() を試しましたが、何か足りないと思います。

4

3 に答える 3

1

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 要求が必要になるため、より多くのトラフィックを生成します。

これが少し役立つことを願っています。:)

于 2012-01-28T02:49:05.587 に答える
1

Jaxl v3.x を使用している場合、必要なのはon_disconnect eventのコールバックを追加することだけです。

また、 XEP-0199 XMPP Pingを使用している必要があります。この XEP が行うことは、接続された jabber サーバーに XMPP ping を定期的に送信することです。また、サーバー ping を受信し、必要な pong パケットを送り返します (たとえば、クライアントがサーバー ping に応答しない場合、jabber.org はしばらくすると接続を切断します)。

最後に、空白の ping も使用する必要があります。空白の ping は、サーバーに送信される単一のスペース文字です。これは多くの場合、NAT デバイスが接続を「生きている」と見なすのに十分であり、Openfire などの特定の Jabber サーバーについても同様です。また、OS が切断された接続をより迅速に検出できるようにすることもできます。つまり、データが送受信されていない TCP 接続は、切断された接続と区別がつきません。

于 2012-08-05T15:01:32.660 に答える
0

私がやったのは、単純に PHP スクリプトを再度実行する crontab を作成することでした。

PHP スクリプトで、最後のフォークの pid の特定のファイルを読み取りました。存在する場合、スクリプトはそれを強制終了しようとします。次に、スクリプトは pcntl_fork() を使用してプロセスをフォークし (PHP スクリプトをデーモン化するのに役立ちます)、新しい PID をファイルに取り込みます。フォークはその後、通常どおり JAXL を使用して Jabber にログインします。

JAXL の作成者と話し合ったところ、ハックであるにもかかわらず、これが最も簡単な方法であることが明らかになりました。ただし、作成者は最近の反復でこの特定の欠陥に取り組んでいる可能性があります。

この特定のメソッドの 1 つの欠点は、デフォルトで PHP でコンパイルされない pcntl_fork() が必要なことです。

于 2012-08-02T18:03:43.663 に答える