我正在为未知数量的客户端实现一个套接字服务器,我在互联网上发现了很多客户端传递给socket_listen方法的例子,但我不知道我的客户端数量是多少。
如果我在没有多个$ backlog的情况下调用socket_listen($ sock),它将适用于多个客户端服务器?
感谢。
答案 0 :(得分:1)
您可以本机执行此操作 - 但对于此0MQ is the answer - 请参阅chat example from Ian's优秀演讲
e.g。 Server.php:
$ctx = new ZMQContext();
$pub = $ctx->getSocket(ZMQ::SOCKET_PUB);
$pub->bind('tcp://*:5566');
$pull = $ctx->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://*:5567');
while(true) {
$message = $pull->recv();
echo "Got ", $message, PHP_EOL;
$pub->send($message);
}
答案 1 :(得分:0)
已经有一段时间了,但让我对此进行一次尝试。
通常,当您在侦听器上获得连接时,您应该创建一个线程来处理该连接并返回侦听。该线程将占用您服务器上的内存,因此没有无限数量,因为您没有无限的内存。一旦线程(或fork)完成连接,应该关闭连接以释放内存并允许另一个线程。
但是,一旦达到限制,新请求仍将获得连接,但它们将排队等候,直到旧连接关闭才会处理。
虽然我没有任何负载分享经验,但我认为可以向其他服务器发出请求,以增加可以同时打开的连接数量。
这就是TCP的工作原理。也许你需要一个带有发布/订阅方案的UDP实现?由于UDP没有连接,因此它可以用更少的内存发布到更多的接收器。