2012-04-16 17 views
5

Ich habe folgende PHP-Skript, das mit dem MongoDB verbindet im Grunde, ein Dokument schreibt und dann schließt die Verbindung 19000 mal:Was passiert, wenn Verbindungen zu MongoDB nicht geschlossen sind?

<?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(); 
} 
?> 

dieses Skript einmal Laufen funktioniert gut, aber wenn ich das Skript ein paar Sekunden später Ich erhalte die Ausnahme 'angeforderte Adresse nicht zuordnen', was verständlich ist, da das Serversystem wahrscheinlich keine Ports mehr hatte.

Wenn ich jedoch $ conf> close() entferne; Ich kann dieses Skript immer wieder ausführen, ohne die Datenbank merklich zu belasten. Ich gehe davon aus, dass dies der Fall ist, weil die Verbindung zur Datenbank dauerhaft ist und die gleiche anfängliche Verbindung für das Skript wieder verwendet.

Was ich gerne wissen würde ist, wenn 20k + verschiedene Benutzer 1 Schleife dieses Skripts zur gleichen Zeit laufen, was würde mit der Datenbank passieren? z.B. Würden die verfügbaren Verbindungen einfach ausgehen, weil jeder Benutzer eine Verbindung zur Datenbank erstellen muss? Oder würden alle diese Benutzer die gleiche erste Verbindung verwenden, die vom ersten Benutzer erstellt wurde?

Antwort

5

Sie sollten nicht aufrufen -> close() bei jeder Iteration. Wenn Sie close aufrufen, weisen Sie den Treiber an, keine persistente Verbindung zu verwenden. Wenn Sie dies in einer engen Schleife ausführen, werden dem OS keine Ports mehr zur Verfügung gestellt, da alle im TIME_WAIT-Status sind.

Die PHP-Treiber verwenden persistente Verbindungen, und wenn (ohne Aufruf -> schließen) Sie „neuen Mongo“ in einer engen Schleife wie in Ihrem Beispiel ausführen, wird der Fahrer nicht neue Verbindungen herzustellen und Wiederverwendung des bereits bestehenden .

+0

Danke für die Erklärung! –

0

Sie würde einen fatalen Fehler:

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

Getestet mit einem mongodb und Standardkonfiguration. MongoDB läuft weiter und andere Skripte machen ihre Arbeit. Vielleicht sollten Sie in Erwägung ziehen, so etwas wie einen Jobserver oder einen Gearman zu verwenden.

Verwandte Themen