4

jaxl ライブラリを使用する xmpp トランザクション用のライブラリがあります。

    class xmpp{

        public function register_user($username, $password){
            require_once 'JAXL/jaxl.php';

            $this->client = new JAXL(array(
                'jid' => 'localhost',
                'log_level' => JAXL_ERROR
            ));         
            $this->username = $username;
            $this->password = $password;

            $this->client->require_xep(array(
                '0077'  // InBand Registration  
            ));     
            $thisClassObject =& $this;

            $this->client->add_cb('on_stream_features', function($stanza) use(&$thisClassObject) {
                $thisClassObject->client->xeps['0077']->get_form('localhost');
                return array($thisClassObject, 'wait_for_register_form');
            });

            $this->client->start();     

            return;
        }

        public function wait_for_register_response($event, $args) {


           if($event == 'end_stream') {
                return;
            }
            else if($event == 'stanza_cb') {
                $stanza = $args[0];
               if($stanza->name == 'iq') {
                if($stanza->attrs['type'] == 'result') {
                    echo "registration successful".PHP_EOL."shutting down...".PHP_EOL;
                    $this->client->end_stream();
                    return 'logged_out';
                }
                else if($stanza->attrs['type'] == 'error') {
                    $error = $stanza->exists('error');
                    echo "registration failed with error code: ".$error->attrs['code']." and type: ".$error->attrs['type'].PHP_EOL;
                    echo "error text: ".$error->exists('text')->text.PHP_EOL;
                    echo "shutting down...".PHP_EOL;
                    $this->client->end_stream();
                    return "logged_out";
                }
            }
        }
    }

         public function wait_for_register_form($event, $args) {

            $stanza = $args[0];
            $query = $stanza->exists('query', NS_INBAND_REGISTER);
            if($query) {
                $form = array();
                $instructions = $query->exists('instructions');
                if($instructions) {
                echo $instructions->text.PHP_EOL;
            }

            $this->client->xeps['0077']->set_form($stanza->attrs['from'], array('username' => $this->username, 'password' => $this->password));
            return array($this, "wait_for_register_response");
        }
        else {
            $this->client->end_stream();
            return "logged_out";
        }
       }    
   }

これらのコードは register_user.php と同じですが、クラスに実装されています。

このクラスをコードで次のように使用します。

$xmppObj = new xmpp();
$xmppObj('user','password');
/*
 some more code after this
/*

実行すると、ユーザーの作成に成功しましたが、メッセージ(「登録に成功しました...」)が出力され、アプリケーションが終了し、クラス関数の後に「この後のコード」を実行しません。つまり、従いませんコード...

この問題を解決するために何ができるでしょうか。JAXL ライブラリに詳しい人が助けてくれます。

4

1 に答える 1

1

examples/register_user.php内にあるものとほとんど同じコードを使用しているようです。ユーザー登録が成功すると、コードの次のセクションから明らかなように、スクリプトはXMPPStreamを閉じます。

if($stanza->attrs['type'] == 'result') {
    echo "registration successful".PHP_EOL."shutting down...".PHP_EOL;
    $this->client->end_stream();
    return 'logged_out';
}

代わりに呼び出す必要が$client->send_end_stream();あり$client->end_stream();ます。これにより、基礎となる XMPPStream が適切なFSM 状態遷移を行うようになります。また、イベントのコールバックを追加しますon_disconnect。このコールバック内で、新しく登録された XMPP アカウントに再度接続を試みることができます。正常に動作するはずです。

: レポジトリから最新のコードをチェックアウトしてください。コア JAXLLoop を再初期化できるように、いくつかの更新を行いました。詳細に興味がある場合は、ここにcommit logがあります。

于 2012-10-28T01:19:15.387 に答える