2012-01-13 71 views
1

我使用zeromq与php绑定连接到Freeswitch(VOIP软件交换机)中的zmq模块。ZeroMQ与PHP订阅者丢失邮件

短:我失去事件。 长: Freeswitch中的zmq模块是以C++作为发布者实现的。 我的PHP代码如下:

<?php 
    $context = new ZMQContext(); 

    echo "connect to freeswitch zmq module..."; 
    $sub = new ZMQSocket($context, ZMQ::SOCKET_SUB); 
    $sub->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE,""); 
    $sub->connect("tcp://192.168.20.73:5556"); 
    $hwm = $sub->getSockOpt(ZMQ::SOCKOPT_HWM); 
    echo "ok.hwm: $hwm\n"; 

    echo "looping\n"; 
    while(1) { 
    $data = $sub->recv(); 
    $d = json_decode($sub->recv(),TRUE); 
    $event = $d["Event-Name"]; 
    $date = $d["Event-Date-Local"]; 
    $ts = $d["Event-Date-Timestamp"]; 
    $msgnr = $d["ZMQ-Msg-Cnt"]; 
    echo "PHP: $date msg# $msgnr $ts received $event\n"; 
} 
?> 

ZMQ-MSG-CNT是序列号我已经建设成为FreeSWITCH中的ZMQ模块。 我可以看到每个第二条消息都丢失了。 tcpdump显示消息是由zmq接收的。

我已将PHP代码转换为C,现在我可以接收每条消息。 C:

#include "zhelpers.h" 
#include "cJSON.h" 

int main (void) 
{ 
    void *context = zmq_init (1); 

    void *subscriber = zmq_socket (context, ZMQ_SUB); 
    zmq_connect (subscriber, "tcp://192.168.20.73:5556"); 
    zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "", 0); 

    while (1) { 
     char *string = s_recv (subscriber); 

     cJSON *root = cJSON_Parse(string); 
     int msgcnt = cJSON_GetObjectItem(root,"ZMQ-Msg-Cnt")->valueint; 

     printf("C: %s msg# %s %s received %s\n", 
      cJSON_GetObjectItem(root,"Event-Date-Local")->valuestring, 
      cJSON_GetObjectItem(root,"ZMQ-Msg-Cnt")->valuestring, 
      cJSON_GetObjectItem(root,"Event-Date-Timestamp")->valuestring, 
      cJSON_GetObjectItem(root,"Event-Name")->valuestring 
     ); 
     cJSON_Delete(root); 
     free (string); 
    } 

zmq_close (subscriber); 
zmq_term (context); 
return 0; 
} 

PHP代码有什么问题吗? PHP是否有任何技巧/必做/提示?

由于提前, 杰拉德韦伯

回答

1

您所呼叫的recv功能两次,从而它加载一个消息,它跳过任何处理,然后加载第二之一:

$data = $sub->recv(); 
// This is your first message, called in a blocking mode 

$d = json_decode($sub->recv(),TRUE); 
// and here's your second one, called in a non-blocking mode 

变化这两行只有一个:

$d = json_decode($sub->recv()); 
+0

omfg.i觉得这么笨....感谢that.works now.sorry浪费大家的时间 – unficyp 2012-01-13 15:41:53

+1

别担心,它发生在我们所有人身上! – 2012-01-13 15:45:45