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のトリック/必須/ヒントはありますか?事前に
おかげで、 ジェラルドは
omfg.iとても愚かなことを感じています。今すぐお祈りください。すべての時間を無駄にします。 – unficyp
心配はありません、私たちすべてに起こります! –