3

我想在 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
       });
}
4

1 回答 1

2

Jaxl 库目前不支持此类回调。这是因为当您调用时$client->send_chat_msg()XMPPStream在底层JAXLSocketClient的输出缓冲区中排队XMPPMsg对象。当套接字准备好写入时,输出缓冲区被刷新。

在排队之前,所有XMPPStanza都由 序列化(to_string()XMPPStream,因此底层JAXLSocketClient输出缓冲区不知道哪个节正在通过写就绪套接字刷新。因此,目前不可能进行此类回调。

有一些非权威的方法可以检查您的消息的传递状态,例如输出缓冲区是否为空?但这很棘手,并不是一个完美的解决方案。

实现此类回调的完美方法是在 的上下文中维护输出缓冲区XMPPStream,然后应通知底层套接字写入就绪状态,最后在通过套接字刷新节之前,XMPPStream可以执行这些回调。不幸的是,这不是图书馆的设计方式。不过,这种回调可能会在库的未来版本中得到支持。

于 2012-10-05T20:29:17.860 回答