2012-01-13 2 views
1

Я использую zeromq с привязками php для подключения к модулю zmq в программном коммутаторе VOIP (Freeswitch).ZeroMQ потерянные сообщения с подписчиком PHP

Short: Я теряю события. Long: Модуль zmq в Freeswitch реализован в 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 представляет собой порядковый номер, я уже встраивать в модуль zmq в FreeSWITCH. Я вижу, что каждое второе сообщение теряется. 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?

Спасибо заранее, Gerald Weber

ответ

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

+1

не волнует, это случается со всеми нами! –

Смежные вопросы