<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'features.persistent-connections.php',
    1 => 'Connexions persistantes aux bases de donn&eacute;es',
    2 => 'Connexions persistantes aux bases de donn&eacute;es',
  ),
  'up' => 
  array (
    0 => 'features.php',
    1 => 'Caract&eacute;ristiques',
  ),
  'prev' => 
  array (
    0 => 'features.connection-handling.php',
    1 => 'Gestion des connexions',
  ),
  'next' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Utilisation des lignes de commande',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'features/persistent-connections.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.persistent-connections" class="chapter">
 <h1 class="title">Connexions persistantes aux bases de données</h1>


<div class="simplesect">
 <h3 class="title">Qu&#039;est-ce que les connexions persistantes ?</h3>
 <p class="simpara">
  Les connexions persistantes aux bases de données SQL sont
  des connexions qui ne se referment pas à la fin du script.
  Lorsqu&#039;une connexion persistante est demandée, PHP s&#039;assure
  qu&#039;il n&#039;y a pas une autre connexion identique (qui serait ouverte
  précédemment, avec le même nom d&#039;hôte,
  d&#039;utilisateur et le même mot de passe), et si une telle connexion
  existe, elle est utilisée ; sinon, elle est créée.
  Une connexion identique est une connexion qui a ouvert le même
  hôte, avec le même nom et le même mot de passe (s&#039;ils
  sont nécessaires).
 </p>
 <p class="simpara">
  Il n&#039;y a pas de méthode pour demander une connexion spécifique, ou garantir
  que l&#039;on obtient une connexion existante ou une toute nouvelle (si toutes les
  connexions sont utilisées, ou si la requête est servie par un autre processus,
  qui a un ensemble de connexions séparé).
 </p>
 <p class="simpara">
  Cela signifie qu&#039;il n&#039;est pas possible d&#039;utiliser les connexions persistantes PHP pour, par exemple :
 </p>
 <ul class="simplelist">
  <li>assigner une session de base de données spécifique à un utilisateur web spécifique</li>
  <li>créer une grande transaction à travers plusieurs requêtes</li>
  <li>initier une requête sur une demande et collecter les résultats sur une autre</li>
 </ul>
 <p class="simpara">
  Les connexions persistantes ne donnent <em>aucune</em>
  fonctionnalité qui n&#039;était pas possible avec des connexions non persistantes.
 </p>
</div>

<div class="simplesect" id="persistent-connections.web">
 <h3 class="title">Requêtes Web</h3>
 <p class="simpara">
  Il existe deux façons pour le serveur web d&#039;utiliser PHP pour générer
  des pages web :
 </p>
 <p class="simpara">
  La première est d&#039;utiliser PHP comme un CGI (Common Interface Gateway).
  Lorsque PHP fonctionne de cette manière, une instance de
  l&#039;interpréteur PHP est créée puis détruite
  pour chaque page demandée. Étant donné que cet interpréteur est
  détruit après chaque requête, toutes les
  ressources acquises (comme une connexion à une base SQL),
  sont purement et simplement détruites. Dans ce cas, il n&#039;y a
  rien à gagner à utiliser des connexions persistantes - elles ne persistent tout simplement pas.
 </p>
 <p class="simpara">
  La deuxième méthode, de loin la plus prisée, est d&#039;exécuter PHP-FPM, ou PHP sous la forme d&#039;un
  module sur un serveur multiprocessus, ce qui revient à dire : Apache.
  Ces configurations ont généralement un processus (le parent) qui
  coordonne un ensemble de processus fils,
  qui servent les fichiers. Lorsque les requêtes parviennent depuis
  un client, elles sont transmises à un fils disponible. Cela signifie
  que si un client fait une deuxième requête, il peut
  être servi par un processus client différent du premier.
  Une fois qu&#039;une connexion persistante est ouverte, toute requête ultérieure
  servie par le même processus fils peut réutiliser la connexion déjà établie
  vers le serveur SQL.
 </p>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
  Il est possible de vérifier quelle méthode les requêtes web utilisent en vérifiant la valeur de
  &quot;Server API&quot; dans la sortie de <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span> ou la valeur de
  <strong><code><a href="reserved.constants.php#constant.php-sapi">PHP_SAPI</a></code></strong>, exécutée depuis une requête web.
  </p>
  <p class="para">
   Si la valeur de Server API est &quot;Apache 2 Handler&quot; ou &quot;FPM/FastCGI&quot;, alors les
   connexions persistantes seront utilisées entre les requêtes servies par le même
   worker. Pour toute autre valeur, les connexions persistantes ne persisteront pas
   après chaque requête.
  </p>
 </p></blockquote>
</div>

<div class="simplesect" id="persistent-connections.cli">
 <h3 class="title">Processus en ligne de commande</h3>
 <p class="simpara">
  Comme PHP en ligne de commande utilise un nouveau processus pour chaque script,
  les connexions persistantes ne sont pas partagées entre les scripts en ligne de commande, donc il n&#039;y a aucun
  intérêt à les utiliser dans des scripts transitoires tels que les crons ou les commandes.
  Cependant, elles peuvent être utiles si, par exemple, l&#039;on écrit un serveur d&#039;applications
  de longue durée qui sert de nombreuses requêtes ou tâches et que chacune peut
  avoir besoin de sa propre connexion à la base de données.
 </p>
 </div>

<div class="simplesect" id="persistent-connections.why">
 <h3 class="title">Pourquoi les utiliser ?</h3>
 <p class="simpara">
  Les connexions persistantes sont utiles si le coût de création d&#039;une liaison
  vers le serveur SQL est élevé. Que ce coût soit réellement élevé ou pas ceci dépend
  de nombreux facteurs : le type
  de base de données, cette base est-elle sur le même serveur
  ou pas, quelle est la charge du serveur de base de données, etc.
  Si le temps de connexion est long, les connexions persistantes seront
  bien utiles, car une fois ouverte par un processus fils, la connexion est
  réutilisable sans avoir à se reconnecter. Avec 20
  processus fils, il suffit d&#039;avoir 20 connexions persistantes ouvertes,
  une par fils.
 </p>
</div>

<div class="simplesect" id="persistent-connections.drawbacks.conn-limits">
 <h3 class="title">Inconvénients potentiels : limites de connexion</h3>
 <p class="simpara">
  Il est à noter que les connexions persistantes ont quelques inconvénients
  lors de l&#039;hébergement d&#039;une base de données dont le nombre maximal de
  connexion risque d&#039;être atteint par les connexions persistantes.
  Si la base de données a une limite de 16 connexions simultanées,
  et que lors d&#039;une session serveur chargée, 17 processus fils tentent de
  se connecter, l&#039;un d&#039;entre eux ne pourra pas. S&#039;il y a des bogues dans
  les scripts qui empêchent les connexions de se fermer (comme des boucles
  infinies), la base de données avec seulement 16 connexions peut être
  rapidement submergée.
 </p>
 <p class="simpara">
  Les connexions persistantes augmenteront généralement le nombre de connexions ouvertes
  à un moment donné parce que les travailleurs inactifs conserveront les connexions pour
  les requêtes précédentes qu&#039;ils ont servies. Si un grand nombre de travailleurs est lancé pour
  gérer un afflux de requêtes, les connexions qu&#039;ils ont ouvertes resteront jusqu&#039;à
  ce que le travailleur soit tué ou que le serveur de base de données ferme la connexion.
 </p>
 <p class="simpara">
  Il faut s&#039;assurer que le nombre maximal de connexions autorisées par le serveur de base de données
  est supérieur au nombre maximal de travailleurs de requêtes web (plus toute autre
  utilisation telle que les crons ou les connexions administratives).
 </p>
 <p class="simpara">
  Vérifier la documentation de la base de données pour des informations sur la gestion des connexions abandonnées ou
  inactives (timeouts). Des timeouts longs peuvent augmenter considérablement le
  nombre de connexions persistantes ouvertes à un moment donné.
 </p>
</div>

 <div class="simplesect" id="persistent-connections.drawbacks.state">
  <h3 class="title">Inconvénients potentiels : Maintien de l&#039;état de connexion</h3>
  <p class="simpara">
   Certaines extensions de base de données effectuent un nettoyage automatique lorsque la connexion est
   réutilisée ; d&#039;autres laissent cette tâche à la discrétion du développeur d&#039;application.
   En fonction de l&#039;extension de base de données choisie et de la conception de l&#039;application, un
   nettoyage manuel peut être nécessaire avant la fin du script. Les modifications qui peuvent laisser
   les connexions dans un état inattendu incluent :
  </p>
  <ul class="simplelist">
   <li>Base de données sélectionnée / par défaut</li>
   <li>Verrous de table</li>
   <li>Transactions non commises</li>
   <li>Tables temporaires</li>
   <li>Paramètres ou fonctionnalités spécifiques à la connexion telles que le profilage</li>
  </ul>
  <p class="simpara">
   Les verrous de table et les transactions qui ne sont pas nettoyés ou fermés peuvent
   entraîner le blocage indéfini d&#039;autres requêtes et/ou provoquer
   des modifications inattendues lors de la réutilisation ultérieure de la connexion.
  </p>
  <p class="simpara">
   Avoir la mauvaise base de données sélectionnée entraînera la réutilisation de
   la connexion incapable d&#039;exécuter les requêtes suivantes comme prévu (ou de les exécuter sur
   la mauvaise base de données si les schémas sont suffisamment similaires).
  </p>
  <p class="simpara">
   Si les tables temporaires ne sont pas nettoyées, les requêtes suivantes ne pourront pas
   recréer la même table.
  </p>
  <p class="simpara">
   Il est possible d&#039;implémenter le nettoyage en utilisant des destructeurs de classe ou
   <span class="function"><a href="function.register-shutdown-function.php" class="function">register_shutdown_function()</a></span>. Il est également possible d&#039;envisager
   des proxies de mise en pool de connexions dédiés qui incluent cela dans
   leur fonctionnalité.
  </p>
 </div>

 <div class="simplesect" id="persistent-connections.final-words">
  <h3 class="title">Derniers mots</h3>
  <p class="simpara">
   Étant donné leur comportement et les inconvénients potentiels décrits ci-dessus, il est recommandé de ne pas
   utiliser les connexions persistantes sans une réflexion approfondie. Elles ne devraient pas être
   utilisées sans mettre en œuvre des modifications supplémentaires dans l&#039;application et une configuration
   soigneuse du serveur de base de données et du serveur web et/ou PHP-FPM.
  </p>
  <p class="simpara">
   Considérez des solutions alternatives telles que l&#039;investigation et la correction des causes des
   surcoûts de création de connexion (par exemple, la désactivation des recherches DNS inverses sur
   le serveur de base de données), ou des proxies de mise en pool de connexions dédiés.
  </p>
  <p class="simpara">
   Pour les API web à fort volume, envisagez d&#039;utiliser des runtimes alternatifs ou des serveurs
   d&#039;applications de longue durée.
  </p>
 </div>

 <div class="simplesect" id="persistent-connections.seealso">
   <h3 class="title">Voir aussi</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.ibase-pconnect.php" class="function">ibase_pconnect()</a></span></li>
   <li><span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span></li>
   <li><span class="function"><a href="function.odbc-pconnect.php" class="function">odbc_pconnect()</a></span></li>
   <li><span class="function"><a href="function.pfsockopen.php" class="function">pfsockopen()</a></span></li>
   <li><span class="function"><a href="function.pg-connect.php" class="function">pg_connect()</a></span></li>
   <li><a href="mysqli.persistconns.php" class="link">MySQLi et les connexions persistantes</a></li>
   <li><a href="pdo.connections.php" class="link">Gestion de connexions PDO</a></li>
  </ul>
 </div>
</div>
<?php manual_footer($setup); ?>