La conexión a MongoDB es tan fácil como usar new Mongo, pero hay muchas más opciones y configuraciones adicionales. La página Mongo::__construct() cubre todas las opciones del API, pero está página ofrece más detalles y consejos para casos de uso prácticos.
Si MongoDB es iniciado con la opción --auth o con la opción --keyFile, deben acceder antes de realizar cualquier operación con el driver. Puede acceder a una conexión mediante el ingreso del nombre de usuario y contraseña en la URI de conexión:
<?php
$m = new Mongo("mongodb://${username}:${password}@localhost");
?>
Si la conexión es interrumpida, el driver intentará automáticamente reconectarlo y reautentificarlo.
También puede autentificar a nivel de base de datos con MongoDB::authenticate():
<?php
$m = new Mongo();
$db = $m->admin;
$db->authenticate($username, $password);
?>
La mayor desventaja de este método: es si la conexión con la base de datos es borrada será reconectada, pero la conexión no será autentificada. Si utiliza el formato URI, el driver automáticamente autentificará al usuario cuando una nueva conexión es realizada.
Para autentificar con una base de datos diferente, se debe especificar el nombre de la base de datos después del host. En este ejemplo se logueara un usuario en la base de datos llamado "blog":
<?php
$m = new Mongo("mongodb://${username}:${password}@localhost/blog");
?>
Para conectarse a un grupo réplica, se debe especificar uno o más miembros del grupo usando la opción replicaSet.
<?php
$m = new Mongo("mongodb://localhost:27017", array("replicaSet" => "myReplSetName"));
?>
Se require la versión 1.0.9+ del driver para conectar a un grupo réplica (versiones anteriores del driver no autodetecta el master o no reconecta correctamente).
El driver de PHP hará una petición a los servidor(es) de base de datos listados para descubrir cual es el master. Mientras se pueda conectar almenos a uno de los servidores listados y pueda encontrar el master, la conexión se establecerá con éxito. Si no se puede realizar una conexión a ninguno de los servidores listados o no puede encontrar el master, MongoConnectionException devolverá una excepción.
Si el master no se encuentra disponible, los slaves ó esclavos no promocionarán un nuevo master por algunos segundos. Durante ese tiempo, el controlador no podrá realizar ninguna operación en la base de datos (excepto las conexiones a los slaves que seguirán disponibles para operaciones de lectura) Por lo tanto, si se intenta hacer cualquier tipo de consulta de lectura o escritura mientras esto suceda, se devolverá una excepción.
Una vez el master es elegido, al realizar una lectura o escritura el driver detectará cual es el nuevo master. Establecerá la conexión como como primaria y continuará operando normalmente.
Para obtener más información acerca de grupos replica, consulte la » documentación del núcleo.
Si se está ejecutando MongoDB localmente con la versión 1.0.9 o superior del driver, se puede conectar a la base de datos vía fichero. MongoDB automáticamente abre un fichero socket al iniciarse: /tmp/mongodb-<port>.sock.
Para conectarse al fichero socket, especifique la ruta de la conexión MongoDB:
<?php
$m = new Mongo("mongodb:///tmp/mongo-27017.sock");
?>
Si se quiere utilizar autenticación en la conexión (tal y como se indica más arriba) usando un fichero socket, se debe especificar el puerto 0 para que el analizador de la cadena de conexión sepa donde acaba la cadena de conexión.
<?php
$m = new Mongo("mongodb://username:password@/tmp/mongo-27017.sock:0/foo");
?>
La creación de conexiones es uno de las cosas más pesada que el driver realiza. Puede tomar miles de milisegundos establecer una conexión correcta, incluso en una red rápida. Por lo tanto, el driver intentará reducir el número de nuevas conexiones creadas mediante la reutilización del pool de conexiones.
Cuando un usuario crea una nueva instancia de Mongo, todas las conexiones necesarias serán tomadas por el pool (un conjunto de replicas de conexiones pueden requerir conexiones múltiples). Cuando la instancia de Mongo se sale del ámbito, las conexiones se retornarán al pool. Cuando el proceso en PHP termine, todas las conexiones en el pools serán cerrados.
Las conexiones en el pool pueden generar un gran número de estas. Esto es normal y, con un poco de aritmética, es posible averiguar la cantidad de conexiones que se experan. Hay tres factores en el número total de conexiones:
connections_per_pool
Cada pool creará, por omisión, un número ilimitado de conexiones. Uno puede suponer que este es un problema: si puede crear un número ilimitado de conexiones, no se podría crear miles y el servidor se quedaría sin descriptores de ficheros. En la práctica, es poco probable, ya que las conexiones no utilizadas son devueltas al pool para usarlos luego, Así las futuras conexiones van a utilizar la misma conexión en lugar de crear uno nuevo. A menos que cree miles de conexiones a la vez sin que ninguna este fuera del ámbito, el número de conexiones abiertas deben permanecer en un número razonable.
Puede verse cuantas conexiones se tiene en el pool utilizando la función MongoPool::info(). Agregue los campos "in use" y "in pool" de un servidor determinado. Ese será el número total de conexiones de ese pool.
pools_per_process
Cada dirección del servidor MongoDB al cual se va a conectar contiene su propio pool de conexiones. Por ejemplo, si el hostname local es "example.net", connectarse a "example.net:27017", "localhost:27017", y "/tmp/mongodb-27017.sock" creará tres grupos pools de conexiones. Puede ver como muchos grupos pools de conexiones tienes abiertas usando MongoPool::info().
processes
Cada proceso PHP tiene un conjunto independiente de pools. PHP-FPM y Apache generalmente crean entre 6 y un par de docenas de PHP worker children. Compruebe su configuración y vea cuál es el máximo número de procesos de PHP que se pueden procesar.
Si está usando PHP-FPM, la estimación del número de conexiones puede ser difícil porque este puede procesar más workers de PHP-FPM y así volver pesado la carga. Para estar en lado de la seguro, mire en parámetro max_children o sume spare_servers+start_servers (elegir el número más alto). Así es cómo muchos procesos en PHP (y, por tanto, se establece en los pools) debes planificarlo.
The three variables above can be multiplied together to give the max number of connections expected: connections_per_pool*pools_per_process*processes. Note that connections_per_pool can be different for different pools, so connections_per_pool should be the max.
Por ejemplo, supongamos que se recibe 30 conexiones por pool, 10 pools por procesos en PHP, y 128 procesos PHP. Entonces podemos esperar 38400 conexiones desde esta máquina. Por lo tanto, debemos establecer el límite del descriptor del fichero para ser lo suficientemente alto para manejar todas las conexiones o pueda ejecutarse los ficheros de descriptores.
See MongoPool para obtener más información sobre la conexión pooling.
Nota:
Esta sección no es relevante para 1.2.0+. En 1.2.0+, siempre las conexiones que son persistentes son administradas automáticamente por el driver
Crear una nueva conexión cada vez a la base de datos es muy lento. Para minimizar el número de conexiones que se necesite, se pueden usar las conexiones persistentes. Una conexión persistente es guardada por PHP, para que pueda usarse la misma conexión en múltiples peticiones.
Por ejemplo, este simple programa para conectarse 1000 veces a la base de datos:
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo();
}
?>
Esto tarda apróximadamente 18 segundos en ejecutarse. Pero si lo cambiamos para que utilice una conexión persistente:
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo("localhost:27017", array("persist" => "x"));
}
?>
...tardará menos de 0.02 segundos en ejecutarse, ya que solo se realiza una sola conexión a la base de datos.
Las conexiones persistentes necesitan indicarse usando la variable de identificación (tal y como se muestra "x" en el ejemplo anterior). Para que la conexión persistente pueda usarse, el hostname, puerto, variable persist y el usuario y contraseña (si es necesario) debe coincidir con una conexión persistente ya existente. De lo contrario, se creará una nueva conexión los datos proporcionados.
Las conexiones persistentes son altamente recomendables y se deberían usar siempre en producción a no ser que exista una razón con fundamento para hacer lo contrario. La mayoría de razones por las cuales no son recomendadas para bases de datos relacionales son totalmente irrelevantes para MongoDB.