2012-04-16 25 views
5

Tengo el siguiente script PHP que básicamente se conecta a la MongoDB, escribe un documento y luego cierra la conexión 19000 veces:¿Qué sucede cuando las conexiones a MongoDB no están cerradas?

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

ejecutar este script una vez que funciona bien, pero si se me acaba el guión unos segundos más tarde , Obtengo la excepción 'No se puede asignar la dirección solicitada', lo cual es comprensible ya que el sistema del servidor probablemente se quedó sin puertos.

Sin embargo, elimino $ con> close(); Puedo ejecutar esa secuencia de comandos una y otra vez sin ninguna tensión notable en la base de datos. Supongo que esto se debe a que la conexión a la base de datos es persistente y reutiliza la misma conexión inicial en el script.

Lo que me gustaría saber es si 20k + usuarios diferentes ejecutaron 1 bucle de este script al mismo tiempo, ¿qué pasaría con la base de datos? p.ej. ¿las conexiones disponibles simplemente se agotarían porque cada usuario necesita crear una conexión con la base de datos? ¿O todos esos usuarios estarían usando la misma conexión inicial creada por el primer usuario?

Respuesta

5

No debe llamar a -> close() en cada iteración. Si llama cerca, le dice al conductor que no reutilice una conexión persistente. Si ejecuta esto en un bucle cerrado, el sistema operativo se queda sin puertos para usar, ya que todos están en estado TIME_WAIT.

El conductor PHP utiliza conexiones persistentes, y si (sin llamar -> cerrar) ejecuta "nueva Mongo" en un bucle estrecho como en tu ejemplo, el conductor se no hacer nuevas conexiones y volver a utilizar la ya existente .

+0

¡Gracias por la explicación! –

0

que se obtendría un error fatal:

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

testet con una configuración por defecto y mongodb. MongoDB sigue funcionando y otros scripts siguen haciendo su trabajo. Tal vez deberías considerar usar algo así como un servidor de trabajo, gearman por ejemplo.

Cuestiones relacionadas