5

基本的にMongoDBに接続し、ドキュメントを書き込み、接続を19000回閉じる次のPHPスクリプトがあります。

<?php
for($i=0; $i < 19000; $i++) {
    $con = new Mongo("mongodb://localhost:27017");
    $db = $con->selectDB('test');

    $col = $db->selectCollection('close_wait_test');
    $col->insert(array('Test' => 'Value1'));

    $con->close();
}
?>

このスクリプトを 1 回実行すると正常に動作しますが、数秒後にスクリプトを実行すると、「要求されたアドレスを割り当てることができません」という例外が発生します。これは、サーバー システムでポートが不足している可能性があるため理解できます。

ただし、 $con->close(); を削除します。データベースに目立った負担をかけることなく、そのスクリプトを何度も実行できます。これは、データベースへの接続が永続的であり、スクリプトで同じ初期接続を再利用するためだと思います。

私が知りたいのは、2 万人以上の異なるユーザーがこのスクリプトの 1 つのループを同時に実行した場合、データベースに何が起こるかということです。たとえば、各ユーザーがデータベースへの接続を 1 つ作成する必要があるため、使用可能な接続が単純になくなるのでしょうか? または、それらのすべてのユーザーが、最初のユーザーによって作成された同じ初期接続を使用しますか?

4

2 に答える 2

5

すべての反復で ->close() を呼び出すべきではありません。close を呼び出すと、永続的な接続を再利用しないようにドライバーに指示します。これをタイトなループで実行すると、OS は使用するポートを使い果たします。ポートはすべて TIME_WAIT 状態になるためです。

PHPドライバーは永続的な接続を使用し、(-> closeを呼び出さずに)例のように「新しいMongo」をタイトループで実行すると、ドライバーは新しい接続を作成せず、既存のものを再利用します。

于 2012-04-16T13:50:59.373 に答える
0

致命的なエラーが発生します:

PHP Fatal error: Uncaught exception 'MongoConnectionException' with message 'Cannot assign requested address' in /home/pierre/test.php:3 Stack trace: #0 /root/test.php(3): Mongo->__construct('mongodb://local...') #1 {main} thrown in /home/pierre/test.php on line 3

c=0; while [ $c -le 20000 ]; do php test.php; c=$[c+1]; done

mongodb とデフォルト設定の Testet。MongoDB は実行を続け、他のスクリプトは仕事を続けます。おそらく、ジョブサーバーのようなもの、たとえばギアマンの使用を検討する必要があります。

于 2012-04-16T12:42:51.170 に答える