# Connection handling and persistence

> Nota: En plataformas Unix, el controlador de MongoDB es susceptible a scripts que utilizan la llamada al sistema fork() sin llamar también a exec(). Los usuarios están advertidos de no reusar instancias de MongoDB\Driver\Manager en un proceso hijo bifurcado («forked»).

## Persistencia de conexión y topología (PHP y HHVM desde versión 1.2.0)

Todas las versiones del controlador desde la 1.2.0 hacen persistente el objeto cliente » libmongoc del proceso trabajador de PHP, lo que le permite reutilizar conexiones a bases de datos, estadod de autenticación, e información de topología entre varias peticiiones.

Cuando MongoDB\Driver\Manager::__construct() se invoca, se crea un hash con sus argumentos (esto es, cadena de URI y opciones de array). El controlador intentará encontrar un objeto cliente » libmongoc persistente anterior par tal hash. Si no se puede encontrar un cliente existente para el hash, se creará un nuevo cliente (y se hará persistente para un uso futuro).

Cada cliente contiene su propia conexión a una base de datos y una vista de la topología del servidor (p.ej., independiente, conjunto réplica, 'clúster' fragmentado). Haciendo persistente el cliente entre peticiones de PHP, el controlador es capaz de reutilizar conexiones de bases de datos establecidas y eliminar la necesidad de » descubrir la topología del servidor en cada petición.

Considere el siguiente ejemplo:

`<?php
$managers = [
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'),
new MongoDB\Driver\Manager('mongodb://rs1.example.com,rs2.example.com/', ['replicaSet' => 'myReplicaSet']),
];
foreach ($managers as $manager) {
$manager->executeCommand('test', new MongoDB\Driver\Command(['ping' => 1]));
}
?>`

Los primeros dos objetos Manager compartirán el mismo cliente » libmongoc ya que los argumentos de sus constructores son idénticos. El tercer y cuarto objetos utilizarán cada un su propio cliente. En total, se crearán tres clientes y el trabajador de PHP que ejecute este script abrirá dos conexiones a `127.0.0.1` y una conexión a `rs1.example.com` y otra a `rs2.example.com`. Si el controlador descubre miembros adicionales de un conjunto réplica después de emitir comandos `isMaster`, abrirá conexiones adicionales también para esos servidores.

Si el mismo trabajador ejecuta el script de nuevo en una segunda petición, los tres clientes serán reutilizados y no deberían hacerse nuevas conexiones. Dependiendo del hace cuánto tiempo se sirvió la petición anteriior, el controlador podría necesitar emitir comandos `isMaster` adicionales para actualizar su vista de las topologías.

## Persistencia de socket (PHP versiones anteriores a la 1.2.0)

Las versiones del controlador de PHP anteriores a la 1.2.0 utilizan la API de Flujos de PHP para conexiones a bases de datos, empleando una API dentro de » libmongoc para designar manejadores propios para la comunicación de sockets. Sin embargo, se crea un nuevo cliente libmongoc para cada MongoDB\Driver\Manager. Como resultado, el controlador hace persistir conexiones a bases de datos individuales, aunque no el estado de autenticación o la información de la topología. Esto sifgnifica que el controlador necesita emitir comandos al inicio de cada petición para autenticar y » descubrir la topología del servidor.

Las conexiones a bases de datos son persistentes mediante un hash derivador del puerto, host y cadena URI del servidor empleados para construit el MongoDB\Driver\Manager. Las opciones de array del constructor no estan incluidas en este hash.

> Nota: Las versiones del controlador >= 1.1.8 y < 1.2.0 no hacen persistentes sockets para conexinoes SSL. Véase » PHPC-720 para más información.

A pesar de sus deficiencias con conexiones SSL persistentes e información de topología, esta versioón del controlador admite todas las opciones de contexto SSL debido a que utiliza la API de Flujos de PHP.

## Sin persistencia (versiones de HHVM anteriores a la 1.2.0)

Las versiones del controlador HHVM anteriores a la 1.2.0 no hacen persistentes sockets, estados de autenticación o información de topología, La comunicación de socket emplea » libmongoc completamente.