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