ZeroMQ PULL服务未扩展,不关闭连接 P>挑战是简单地复制和推送几百个HTTP请求/ SEC从PHP到单个C++拉服务器。拉式服务器只是将请求写入标准输出

ZeroMQ PULL服务未扩展,不关闭连接 P>挑战是简单地复制和推送几百个HTTP请求/ SEC从PHP到单个C++拉服务器。拉式服务器只是将请求写入标准输出,php,c++,linux,zeromq,Php,C++,Linux,Zeromq,在负载下,系统将处理负载,直到PULL服务器耗尽其10000的打开文件限制,然后停止接受连接,并将自己固定在100%的CPU使用率 服务器的主要部分如下所示,删除了所有错误捕获代码: // Crank up zmq ctx = zmq_ctx_new (); // Pull socket type in the pipeline pattern s = zmq_socket (ctx, ZMQ_PULL); rc = zmq_bind (s, socketdsn); // Create a

在负载下,系统将处理负载,直到PULL服务器耗尽其10000的打开文件限制,然后停止接受连接,并将自己固定在100%的CPU使用率

服务器的主要部分如下所示,删除了所有错误捕获代码:

// Crank up zmq
ctx = zmq_ctx_new ();

// Pull socket type in the pipeline pattern
s = zmq_socket (ctx, ZMQ_PULL);
rc = zmq_bind (s, socketdsn);

// Create a buffer to store messages
char buffer[MAX_BUFFER] = {0};
while (true) {
    // Get the message
    rc = zmq_recv (s, buffer, MAX_BUFFER, 0);

    // Tack a null at the end of the string so printf will work...
    buffer[rc] = 0;

    // Output the string.
    printf("%s\n", buffer);
}
rc = zmq_close (s);
rc = zmq_term (ctx);
PHP推送服务器的主要部分如下所示:

$dsn = "tcp://localhost:5555";
// Create context
$ctx = new ZMQContext();
$socket = $ctx->getSocket(ZMQ::SOCKET_PUSH, 'my socket');
$socket->connect($dsn, true);
$rc = $socket->send($message);
$socket->close($dsn);

我的猜测是,在收到消息后,PULL服务器必须手动关闭其连接。PUSH客户端是一个PHP进程,PULL服务器永远不会看到来自它的另一条消息,关闭连接是安全的。但似乎没有一个合适的函数来实现这一点。有什么想法吗?

发现问题,创建PHP上下文而不持久:$ctx=new ZMQContext1,false;有问题的PHP是在Apache/Nginx之后运行的,还是它是一个CLI的东西?