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 に答える