<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mongodb.architecture.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'mongodb.connection-handling.php',
    1 => 'Connections',
    2 => 'Gestion de la connexion et de la persistance',
  ),
  'up' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Architecture et fonctionnalit&eacute;s sp&eacute;ciales',
  ),
  'prev' => 
  array (
    0 => 'mongodb.overview.php',
    1 => 'Architecture',
  ),
  'next' => 
  array (
    0 => 'mongodb.persistence.php',
    1 => 'Persister des donn&eacute;es',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/mongodb/architecture.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mongodb.connection-handling" class="section">
  
  <h2 class="title">Gestion de la connexion et de la persistance</h2>

  
<blockquote class="note"><p><strong class="note">Note</strong>: 
<span class="simpara">
    Sur les plate-formes Unix, l&#039;extension MongoDB est sensible aux scripts qui utilisent
    l&#039;appel système fork() sans pour autant appeler exec(). Vous ne devez pas ré-utliser
    des instances <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span> dans une processus
    fils issue d&#039;un fork.
</span>
</p></blockquote>


  <div class="section">
   <h2 class="title">Connexions et topologie persistante (version PHP depuis 1.2.0)</h2>

   <p class="simpara">
    Toutes les versions de l&#039;extension depuis 1.2.0 conservent l&#039;objet client
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> dans le processus
    PHP, ce qui lui permet de réutiliser les connexions de base de données, les
    états d&#039;authentification, <em>et</em> les informations de
    topologie à travers plusieurs requêtes.
   </p>

   <p class="simpara">
    Lorsque <span class="methodname"><a href="mongodb-driver-manager.construct.php" class="methodname">MongoDB\Driver\Manager::__construct()</a></span> est
    invoqué, un hachage est créé à partir de ses arguments (c&#039;est-à-dire la
    chaîne URI et le tableau d&#039;options). L&#039;extension tentera de trouver un objet
    client <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> 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&#039;option du pilote
    <code class="literal">&quot;disableClientPersistence&quot;</code>.
   </p>

   <p class="simpara">
    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&#039;extension est capable de réutiliser les connexions de base de données
    établies et d&#039;éliminer le besoin de
    <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;découvrir la topologie du serveur</a>
    à chaque requête.
   </p>

   <p class="simpara">
    Considérez l&#039;exemple suivant :
   </p>

   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$managers </span><span style="color: #007700">= [<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1:27017'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://rs1.example.com,rs2.example.com/'</span><span style="color: #007700">, [</span><span style="color: #DD0000">'replicaSet' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'myReplicaSet'</span><span style="color: #007700">]),<br />];<br /><br />foreach (</span><span style="color: #0000BB">$managers </span><span style="color: #007700">as </span><span style="color: #0000BB">$manager</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$manager</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeCommand</span><span style="color: #007700">(</span><span style="color: #DD0000">'test'</span><span style="color: #007700">, new </span><span style="color: #0000BB">MongoDB\Driver\Command</span><span style="color: #007700">([</span><span style="color: #DD0000">'ping' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">]));<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="simpara">
    Les deux premiers objets <span class="classname"><strong class="classname">Manager</strong></span> partageront le même
    client <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> 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 à
    <code class="literal">127.0.0.1</code> et une connexion à chacun de
    <code class="literal">rs1.example.com</code> et <code class="literal">rs2.example.com</code>.
    Si l&#039;extension découvre des membres supplémentaires de l&#039;ensemble de réplicas
    après avoir émis des commandes <code class="literal">hello</code>, elle ouvrira des
    connexions supplémentaires à ces serveurs également.
   </p>

   <p class="simpara">
    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&#039;extension
    peut avoir besoin d&#039;émettre des commandes <code class="literal">hello</code> supplémentaires
    pour mettre à jour sa vue des topologies.
   </p>
  </div>

  <div class="section">
   <h2 class="title">Persistance des sockets (versions PHP avant 1.2.0)</h2>

   <p class="simpara">
    Les versions de l&#039;extension avant 1.2.0 utilisent l&#039;API des flux PHP pour
    les connexions de base de données, utilisant une API dans
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> pour désigner des
    gestionnaires personnalisés pour la communication par socket ; cependant, un
    nouveau client libmongoc est créé pour chaque
    <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. En conséquence, l&#039;extension
    persiste les connexions de base de données individuelles mais pas l&#039;état
    d&#039;authentification ou les informations de topologie. Cela signifie que
    l&#039;extension doit émettre des commandes au début de chaque requête pour
    s&#039;authentifier et
    <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;découvrir la topologie du serveur</a>.
   </p>

   <p class="simpara">
    Les connexions de base de données sont persistées par un hachage dérivé de
    l&#039;hôte du serveur, du port et de la chaîne URI utilisée pour construire le
    <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. Les options du tableau du
    constructeur ne sont pas incluses dans ce hachage.
   </p>

   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <span class="simpara">
     Les versions de l&#039;extension &gt;= 1.1.8 et &lt; 1.2.0 ne persistent pas les
     sockets pour les connexions SSL. Voir
     <a href="https://jira.mongodb.org/browse/PHPC-720" class="link external">&raquo;&nbsp;PHPC-720</a> pour plus
     d&#039;informations.
    </span>
   </p></blockquote>

   <p class="simpara">
    Malgré ses lacunes avec les connexions SSL persistantes et les informations
    de topologie, cette version de l&#039;extension supporte toutes les
    <a href="context.ssl.php" class="link">options de contexte SSL</a> puisqu&#039;elle
    utilise l&#039;API des flux PHP.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>