Ich habe in den letzten 2 Tagen mit diesem Problem gerungen, und schließlich einen Hack gefunden, um Dinge zum Laufen zu bringen. Ich dokumentiere es hier, weil dies die Frage des Stack-Überlaufs war, die mir am häufigsten bei der Suche nach Antworten erschien.
Die $ conn-> presence() -Methode sendet nicht nur Ihre Anwesenheitsinformationen an den Server; Es sammelt auch Anwesenheitsinformationen für jeden Kontakt vom Server. Das grundlegende Problem besteht darin, dass Sie beim Senden des Befehls $ conn-> present() dem Skript Zeit geben müssen, diese Informationen vom Server zu empfangen und zu verarbeiten. Die Beispielskripte verwenden $ conn-> processUntil ('presence'), um dies zu tun, aber aus irgendeinem Grund pausierte ich die Dinge nicht lange genug, um alle Roster-Informationen zu erhalten.
Um dies zu umgehen, habe ich schließlich nur $ conn-> processTime (2) verwendet, zwingt die Dinge zu warten 2 Sekunden, bevor Sie fortfahren. Das ist gut genug für meine Zwecke, aber ist eindeutig ein Hack. So Ihr Code als Beispiel:
require_once('XMPPHP/XMPP.php');
$conn = new XMPPHP_XMPP('talk.google.com', 5222, '[email protected]', 'xxxxx', 'xmpphp', 'gmail.com', $printlog = true, $loglevel = XMPPHP_Log::LEVEL_VERBOSE);
$conn->connect();
$conn->processUntil('session_start');
$conn->presence($status='Controller available.');
$conn->processTime(2);
// now see the results
$roster = $conn->roster->getRoster();
print_r($roster); // you should now see roster array with presence info for each contact
Um Ihre Frage genauer zu beantworten, können Sie den folgenden anstelle des Codes unter Verwendung „jetzt die Ergebnisse sehen“:
$my_jid = '[email protected]'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];
Das wird angezeigt der Online-Status für die von Ihnen angegebene ID.
Beachten Sie, dass ich in diesem Beispiel auch den Konstruktor änderte, um das ausführlichste mögliche Protokoll anzuzeigen. Dies war der Schlüssel, um mir dabei helfen zu können.
Eine bessere Lösung wäre natürlich, einen $ conn-> processUntil ('roster') Befehl zum Framework hinzuzufügen, oder so ähnlich. Aber da das Framework in 5 Jahren nicht aktualisiert wurde, ist das unwahrscheinlich.
Hoffentlich wird dies jemandem die Stunden sparen, die ich verloren habe zu versuchen, es zu lösen. Prost.
Es ist eine Weile her, seit ich in XMPP integriert habe. Können Sie den Logging-Level erhöhen und uns die rohe Antwort von Google zeigen? – Kevin
Wie meinst du Status? Statusmeldung oder Status Abwesend/Online usw.? Wenn Sie eine Statusmeldung benötigen, dann $ conn-> presence ($ status = 'Controller available.'); ist dein Status. – pregmatch