如何实现接受无限数量客户端的套接字服务器?

时间:2012-09-17 18:32:19

标签: php sockets

我正在为未知数量的客户端实现一个套接字服务器,我在互联网上发现了很多客户端传递给socket_listen方法的例子,但我不知道我的客户端数量是多少。

如果我在没有多个$ backlog的情况下调用socket_listen($ sock),它将适用于多个客户端服务器?

感谢。

2 个答案:

答案 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没有连接,因此它可以用更少的内存发布到更多的接收器。