2012-01-13 65 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