1

我正在为未知数量的客户端实现套接字服务器,我在互联网上发现了很多示例,其中最大数量的客户端被传递给 socket_listen 方法,但我不知道我的客户端数量可能是多少。

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

谢谢。

4

2 回答 2

1

您可以在本地执行此操作 - 但对于这个0MQ 是答案- 请参阅Ian精彩演讲中的聊天示例

例如 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);
}
于 2012-09-17T19:29:08.707 回答
0

已经有一段时间了,但让我试一试。

通常,当您在侦听器上获得连接时,您应该创建一个线程来处理该连接并返回侦听。该线程将占用您服务器上的内存,因此不能有无限数量,因为您没有无限内存。一旦线程(或分叉)完成连接,应该关闭连接以释放内存并允许另一个线程。

但是,一旦达到限制,新请求仍将获得连接,但它们将排队等待,直到关闭旧连接后才会处理。

虽然我在负载共享方面没有任何经验,但我认为可以将请求发送给其他服务器以增加可以同时保持打开的连接数量。

这就是 TCP 的工作原理。也许您需要一个带有发布/订阅方案的 UDP 实现?由于 UDP 没有连接,它可以以更少的内存发布到更多的接收器。

于 2012-09-17T18:58:05.903 回答