2012-01-13 9 views
1

私はFreeswitchのzmqモジュール(VOIPソフトウェアスイッチ)に接続するためにphpバインディングでzeromqを使用しています。PHP加入者のZeroMQロストメッセージ

ショート:私はイベントを失っています。 Long: 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モジュールに組み込むきたシーケンス番号です。 すべての2番目のメッセージが失われていることがわかります。 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

をウェーバーあなたは2番目の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とても愚かなことを感じています。今すぐお祈りください。すべての時間を無駄にします。 – unficyp

+1

心配はありません、私たちすべてに起こります! –

関連する問題