我在过去的2天里一直在解决这个问题,最后想出了一个破解工具。我在这里记录它,因为这是在寻找答案时出现的最常见的堆栈溢出问题。
$ conn-> presence()方法不仅可以将您的状态信息发送到服务器,它还收集来自服务器的每个联系人的状态信息。根本问题是,当你发送$ conn-> presence()命令时,你必须给脚本时间来接收和处理来自服务器的这些信息。示例脚本都使用$ conn-> processUntil('presence')来做到这一点,但由于某些原因,我没有停下足够长的时间来获取所有的名单信息。
为了解决这个问题,我最终使用了$ conn-> processTime(2),强制要等待2秒才能继续。这对我的目的来说足够了,但显然是一种黑客。因此,使用你的代码为例:
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
为了更具体地回答你的问题,你可以使用替代代码的下面之下“现在看到的结果”:
$my_jid = '[email protected]'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];
,将显示您提供的jid的在线状态。
请注意,在此示例中,我还更改了构造函数以显示可能的最详细的日志。这对帮助我解决这个问题至关重要。
更好的解决方案显然是向框架添加$ conn-> processUntil('roster')命令或类似的东西。但由于该框架在5年内未更新,因此不太可能发生。
希望这可以节省一些人,我失去了试图解决它的时间。干杯。
自从我整合到XMPP中已经有一段时间了。你能否增加日志记录级别并向我们展示谷歌的原始响应? – Kevin 2013-05-07 18:45:58
你如何看待地位?状态消息或状态离开/在线等?如果你需要状态消息,那么$ conn-> presence($ status ='Controller available。');是你的状态。 – pregmatch 2013-05-11 12:15:03