## Gestion de la connection et de la persistence

> Note: Sur les plate-formes Unix, l'extension MongoDB est sensible aux scripts qui utilisent l'appel système fork() sans pour autant appeler exec(). Vous ne devez pas ré-utliser des instances MongoDB\Driver\Manager dans une processus fils issue d'un fork.

## Connexions et topologie persistante (version PHP depuis 1.2.0)

Toutes les versions de l'extension depuis 1.2.0 conservent l'objet client » libmongoc dans le processus PHP, ce qui lui permet de réutiliser les connexions de base de données, les états d'authentification, et les informations de topologie à travers plusieurs requêtes.

Lorsque MongoDB\Driver\Manager::__construct() est invoqué, un hachage est créé à partir de ses arguments (c'est-à-dire la chaîne URI et le tableau d'options). L'extension tentera de trouver un objet client » libmongoc persisté précédemment pour ce hachage. Si un client existant ne peut pas être trouvé pour le hachage, un nouveau client sera créé et persisté pour une utilisation future. Ce comportement peut être désactivé via l'option du pilote `"disableClientPersistence"`.

Chaque client contient ses propres connexions de base de données et une vue de la topologie du serveur (par exemple, autonome, ensemble de réplicas, grappe de fragments). En persistant le client entre les requêtes PHP, l'extension est capable de réutiliser les connexions de base de données établies et d'éliminer le besoin de » découvrir la topologie du serveur à chaque requête.

Considérez l'exemple suivant :

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

Les deux premiers objets Manager partageront le même client » libmongoc car leurs arguments de constructeur sont identiques. Les troisième et quatrième objets utiliseront chacun leur propre client. Au total, trois clients seront créés et le processus PHP exécutant ce script ouvrira deux connexions à `127.0.0.1` et une connexion à chacun de `rs1.example.com` et `rs2.example.com`. Si l'extension découvre des membres supplémentaires de l'ensemble de réplicas après avoir émis des commandes `hello`, elle ouvrira des connexions supplémentaires à ces serveurs également.

Si les mêmes connexions sont réutilisées par le même processus PHP, les trois clients seront réutilisés et aucune nouvelle connexion ne sera établie. En fonction de la durée écoulée depuis la dernière requête servie, l'extension peut avoir besoin d'émettre des commandes `hello` supplémentaires pour mettre à jour sa vue des topologies.

## Persistance des sockets (versions PHP avant 1.2.0)

Les versions de l'extension avant 1.2.0 utilisent l'API des flux PHP pour les connexions de base de données, utilisant une API dans » libmongoc pour désigner des gestionnaires personnalisés pour la communication par socket ; cependant, un nouveau client libmongoc est créé pour chaque MongoDB\Driver\Manager. En conséquence, l'extension persiste les connexions de base de données individuelles mais pas l'état d'authentification ou les informations de topologie. Cela signifie que l'extension doit émettre des commandes au début de chaque requête pour s'authentifier et » découvrir la topologie du serveur.

Les connexions de base de données sont persistées par un hachage dérivé de l'hôte du serveur, du port et de la chaîne URI utilisée pour construire le MongoDB\Driver\Manager. Les options du tableau du constructeur ne sont pas incluses dans ce hachage.

> Note: Les version de l'extension >= 1.1.8 et < 1.2.0 ne persistent pas les sockets pour les connexions SSL. Voir » PHPC-720 pour plus d'informations.

Malgré ses lacunes avec les connexions SSL persistantes et les informations de topologie, cette version de l'extension supporte toutes les » options de contexte SSL puisqu'elle utilise l'API des flux PHP.