在过去的两天里,我一直在努力解决这个问题,终于想出了一个让事情正常进行的技巧。我在这里记录它,因为这是我在寻找答案时最常出现的堆栈溢出问题。
$conn->presence() 方法不仅将您的在线信息发送到服务器;它还从服务器收集每个联系人的状态信息。根本问题是,当您发送 $conn->presence() 命令时,您必须给脚本时间来接收和处理来自服务器的信息。示例脚本都使用 $conn->processUntil('presence') 来执行此操作,但出于某种原因,我没有暂停足够长的时间来获取所有花名册信息。
为了解决这个问题,我最后只使用了 $conn->processTime(2),迫使事情在继续之前等待 2 秒。这对我的目的来说已经足够了,但显然是一个 hack。因此,以您的代码为例:
require_once('XMPPHP/XMPP.php');
$conn = new XMPPHP_XMPP('talk.google.com', 5222, 'xxxx@gmail.com', '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
要更具体地回答您的问题,您可以使用以下代码代替“现在查看结果”下的代码:
$my_jid = 'user@domain.tld'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];
这将显示您提供的 jid 的在线状态。
请注意,在此示例中,我还更改了构造函数以显示尽可能详细的日志。这是帮助我解决这个问题的关键。
一个更好的解决方案显然是在框架中添加一个 $conn->processUntil('roster') 命令,或者类似的东西。但由于该框架已经 5 年没有更新,这不太可能发生。
希望这可以节省我试图解决它的时间。干杯。