Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 发送消息回调后的jaxl_Php_Xmpp_Xmpphp - Fatal编程技术网

Php 发送消息回调后的jaxl

Php 发送消息回调后的jaxl,php,xmpp,xmpphp,Php,Xmpp,Xmpphp,我想在jaxl中已经发送了一条消息之后执行一些代码。 哪种回调适合这种情况 public function test() { require_once 'JAXL/jaxl.php'; global $client; $client = new JAXL(array( 'jid' => 'user@localhost', 'pass' => 'password',

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

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

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

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


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

谢谢您的回答。我想发送一条消息,然后断开流。对于这种情况,您有什么建议?只需调用
$client->send_chat_msg(),将消息排队即可
然后您可以通过调用
$client->send_end_stream(),立即将XMPP流结束数据包排队(即断开您的客户端)。另外,不要忘记为断开连接时的
事件注册回调。一旦收到该回调,您就可以确定您的消息节已发送。Jaxl库确保按顺序发送消息,即消息包在流结束数据包之前排队,它将保证它们以相同的顺序发送。因此,在您的消息节发送之前,您不会在断开连接时收到
回调。