发送消息回调后的 jaxl
Posted
技术标签:
【中文标题】发送消息回调后的 jaxl【英文标题】:jaxl after send message callback 【发布时间】:2012-10-05 15:31:55 【问题描述】:我想在 jaxl 中发送消息后执行一些代码。 哪种回调适合这种情况?
public function test()
require_once 'JAXL/jaxl.php';
global $client;
$client = new JAXL(array(
'jid' => 'user@localhost',
'pass' => 'password',
'log_level' => JAXL_INFO
));
$client->add_cb('on_stream_features', function($stanza)
global $client,$thisObj;
$client->send_chat_msg('otherUser@localhost','Message');
);
$client->add_cb('on_message_send',function() //some thing like this
//some code
);
【问题讨论】:
【参考方案1】:Jaxl 库目前不支持此类回调。这是因为当您调用$client->send_chat_msg()
时,XMPPStream 在底层JAXLSocketClient 的输出缓冲区中排队XMPPMsg 对象。当套接字准备好写入时,输出缓冲区会被刷新。
在排队之前,所有XMPPStanza 都由XMPPStream
序列化(to_string()
),因此底层JAXLSocketClient
输出缓冲区不知道哪个节正在通过写就绪套接字刷新。因此,目前无法进行此类回调。
有一些非权威的方法可以检查您的邮件的传递状态,例如输出缓冲区是空的吗?但这很棘手,并不是一个完美的解决方案。
实现此类回调的完美方法是在XMPPStream
的上下文中维护输出缓冲区,然后应通知底层套接字写入就绪状态,最后在通过套接字刷新节之前,XMPPStream
可以执行这些回调.不幸的是,这不是图书馆的设计方式。不过,这种回调可能会在库的未来版本中得到支持。
【讨论】:
感谢您的回答。我想发送一条消息,然后断开流。您对这种情况有什么建议? 只需调用$client->send_chat_msg();
将您的消息排队,然后您可以立即通过调用$client->send_end_stream();
将XMPP 流结束数据包排队(即断开您的客户端)。也不要忘记为on_disconnect
事件注册回调。一旦您收到该回调,您就确定您的消息节已发送。 Jaxl 库确保消息按顺序转发,即,由于消息包在流结束包之前排队,它将保证它们以相同的顺序发送。因此,在您发送消息节之前,您不会收到on_disconnect
回调。以上是关于发送消息回调后的 jaxl的主要内容,如果未能解决你的问题,请参考以下文章
将消息发送到 XMPP 服务器的 php 函数不提供日志并且不起作用
无法发送群组消息 - 错误 400 - 修改 - BadRequest