zeromq php,ZeroMQ使用PHP订阅者丢失消息

博主在尝试使用PHP通过ZMQ连接到Freeswitch的ZMQ模块时遇到消息丢失的问题,每两条消息中就有一条丢失。通过将PHP代码转换为C语言后,问题得到解决。怀疑可能是PHP ZMQ库的限制或处理机制导致的。
摘要由CSDN通过智能技术生成

我使用zeromq和php绑定连接到Freeswitch中的zmq模块(一个VOIP软件交换机)。

简而言之:我失去了活动。

长:

Freeswitch中的zmq模块以c ++作为发布者实现。

我的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的任何技巧/必做/提示?

提前致谢,

杰拉尔德韦伯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值