PHP Conference Kansai 2025

Gestión de la conexión y de la persistencia

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»).

Conexiones y topología persistente (versión PHP desde 1.2.0)

Todas las versiones de la extensión desde 1.2.0 conservan el objeto cliente » libmongoc en el proceso PHP, lo que le permite reutilizar las conexiones de base de datos, los estados de autenticación, y la información de topología a través de múltiples consultas.

Cuando MongoDB\Driver\Manager::__construct() es invocado, se crea un hash a partir de sus argumentos (es decir, la cadena URI y el array de opciones). La extensión intentará encontrar un objeto cliente » libmongoc persistido previamente para este hash. Si no se puede encontrar un cliente existente para el hash, se creará un nuevo cliente y se persistirá para su uso futuro. Este comportamiento puede ser desactivado a través de la opción del controlador "disableClientPersistence".

Cada cliente contiene sus propias conexiones de base de datos y una vista de la topología del servidor (por ejemplo, autónomo, conjunto de réplicas, grupo de fragmentos). Al persistir el cliente entre las consultas PHP, la extensión es capaz de reutilizar las conexiones de base de datos establecidas y eliminar la necesidad de » descubrir la topología del servidor en cada consulta.

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 dos primeros objetos Manager compartirán el mismo cliente » libmongoc ya que sus argumentos de constructor son idénticos. Los tercer y cuarto objetos utilizarán cada uno su propio cliente. En total, se crearán tres clientes y el proceso PHP ejecutando este script abrirá dos conexiones a 127.0.0.1 y una conexión a cada uno de rs1.example.com y rs2.example.com. Si la extensión descubre miembros adicionales del conjunto de réplicas después de emitir comandos hello, abrirá conexiones adicionales a estos servidores también.

Si las mismas conexiones son reutilizadas por el mismo proceso PHP, los tres clientes serán reutilizados y no se establecerá ninguna nueva conexión. En función del tiempo transcurrido desde la última consulta servida, la extensión puede necesitar emitir comandos hello adicionales para actualizar su vista de las topologías.

Persistencia de sockets (versiones PHP antes de 1.2.0)

Las versiones de la extensión antes de 1.2.0 utilizan la API de flujos PHP para las conexiones de base de datos, utilizando una API en » libmongoc para designar gestores personalizados para la comunicación por socket; sin embargo, se crea un nuevo cliente libmongoc para cada MongoDB\Driver\Manager. En consecuencia, la extensión persiste las conexiones de base de datos individuales pero no el estado de autentificación o la información de topología. Esto significa que la extensión debe emitir comandos al inicio de cada consulta para autenticarse y » descubrir la topología del servidor.

Las conexiones de base de datos son persistidas por un hash derivado del host del servidor, del puerto y de la cadena URI utilizada para construir el MongoDB\Driver\Manager. Las opciones del array del constructor no están incluidas en este hash.

Nota: Las versiones de la extensión >= 1.1.8 y < 1.2.0 no persisten los sockets para las conexiones SSL. Ver » PHPC-720 para más información.

A pesar de sus carencias con las conexiones SSL persistentes y la información de topología, esta versión de la extensión soporta todas las » opciones de contexto SSL ya que utiliza la API de flujos PHP.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top