2012-10-25 4 views
5

genannt Ich habe Bibliothek für xmpp Transaktionen verwendet jaxl Bibliotheken:jaxl Rückkehr zu funktionieren, dass es von

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"; 
     } 
     }  
    } 

diese Code sind die gleichen wie register_user.php, aber in einer Klasse implementiert;

ich benutze diese Klasse in meinem Code auf diese Weise:

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

, wenn es Benutzer erfolgreich ausführen, erstellen, aber es ist Druck eine Nachricht (‚Registrierung erfolgreich ...‘) und Anwendung beendet und es doesn‘ t führen "einige Code danach" nach der Klassenfunktion, in dem anderen Wort folgt es nicht dem Code ...

Was kann ich tun, um dieses Problem zu lösen, kann mir eine Person helfen, die mit JAXL-Bibliothek vertraut ist .

Antwort

1

Sieht so aus, als ob Sie den gleichen Code verwenden, wie er in examples/register_user.php gefunden wurde. Nach erfolgreicher Benutzerregistrierung ist, schließt Skript XMPPStream wie aus diesem Abschnitt des Codes:

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

Sie stattdessen $client->send_end_stream(); nennen muss und nicht $client->end_stream();. Dadurch wird sichergestellt, dass zugrunde liegenden XMPPStream FSM state transition ordnungsgemäß macht. Fügen Sie auch einen Rückruf für on_disconnect Ereignis hinzu, in diesem Rückruf können Sie versuchen, wieder mit neu registrierten XMPP-Konto zu verbinden, und es sollte einfach gut funktionieren.

Hinweis: Bitte überprüfen Sie den neuesten Code aus dem Repository. Ich habe einige Updates vorgenommen, die es ermöglichen, Core JAXLLoop neu zu initialisieren. Wenn Sie an Details interessiert sind, hier ist die commit log.

Verwandte Themen