<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.oci8.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'oci8.connection.php',
    1 => 'Gestion de la connexion OCI8 et de la mise en file d\'attente',
    2 => 'Gestion de la connexion OCI8 et de la mise en file d\'attente',
  ),
  'up' => 
  array (
    0 => 'book.oci8.php',
    1 => 'OCI8',
  ),
  'prev' => 
  array (
    0 => 'oci8.examples.php',
    1 => 'Exemples',
  ),
  'next' => 
  array (
    0 => 'oci8.fan.php',
    1 => 'Support de FAN (Fast Application Notification : Application de notification Rapide) OCI8',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/oci8/connection.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="oci8.connection" class="chapter">
 <h1 class="title">Gestion de la connexion OCI8 et de la mise en file d&#039;attente</h1>

 <div class="section">
  <h2 class="title">Fonctions de connexion</h2>
  <p class="para">
   L&#039;extension oci8 fournit trois fonctions différentes pour se connecter
   à Oracle. La fonction de connexion standard est la fonction
   <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>. Cette fonction crée une connexion
   à la base de données Oracle et retourne une ressource utilisée
   par les futurs appels à la base de données.
  </p>
  <p class="para">
   La connexion à un serveur Oracle est une opération raisonnablement coûteuse
   en termes de temps que cela nécessite. La fonction <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>
   utilise un cache persistant de connexions qui peut être réutilisé à travers
   différents scripts. Cela signifie qu&#039;une seule connexion sera utilisée par
   processus PHP (ou un fils Apache).
  </p>
  <p class="para">
   Si l&#039;application se connecte à Oracle en utilisant un jeu différent de droits
   de base de données pour chaque utilisateur web, le cache persistant utilisé
   par la fonction <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> devient moins approprié
   car l&#039;augmentation du nombre d&#039;utilisateurs concurrents va affecter les performances
   du serveur Oracle, car il devra maintenir trop de connexions en cache.
   Si l&#039;application est de ce type, il est recommandé d&#039;optimiser l&#039;application
   en utilisant les options de configuration <a href="oci8.configuration.php#ini.oci8.max-persistent" class="link">oci8.max_persistent</a> et <a href="oci8.configuration.php#ini.oci8.persistent-timeout" class="link">oci8.persistent_timeout</a>
   (elles donnent le contrôle sur la taille et la durée de vie du cache
   de connexions persistantes) ou utiliser le pool de connexions résidentes d&#039;Oracle
   (pour les bases de données Oracle 11g et suivants), ou encore, utiliser plutôt
   la fonction <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>.
  </p>
  <p class="para">
   Les fonctions <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> et <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>
   emploient un cache de connexions ; si on fait des appels multiples
   à <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>, en utilisant les mêmes paramètres dans
   un script donné, le second appel ainsi que les suivants retournent le gestionnaire
   de connexion existant. Le cache utilisé par la fonction <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
   est nettoyé à la fin de l&#039;exécution du script ou lorsqu&#039;on ferme explicitement
   le gestionnaire de connexion. <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> a un comportement
   sensiblement identique, à la différence que le cache est maintenu séparément
   et est conservé entre les requêtes HTTP.
  </p>
  <p class="para">
   Il est important de se souvenir de cette fonctionnalité de cache, car elle donne
   l&#039;apparence que les deux gestionnaires ne sont pas isolés au niveau des transactions,
   (ils représentent en fait le même gestionnaire de connexion, ils ne sont donc absolument pas
   isolés). Si l&#039;application a besoin de deux connexions séparées, isolées
   au niveau des transactions, il faut utiliser la fonction <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>.
  </p>
  <p class="para">
   Le cache de la fonction <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> est effacé
   et toutes les connexions à la base de données sont closes lorsque le processus
   PHP se termine, aussi, les connexions persistantes n&#039;ont d&#039;intérêt que lors
   de l&#039;utilisation de PHP comme module Apache ou utilisé avec FPM ou similaire.
   Les connexions persistantes n&#039;ont aucun intérêt via <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
   lorsque PHP est utilisé comme CGI ou en ligne de commande.
  </p>
  <p class="para">
   <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span> crée toujours une nouvelle connexion au
   serveur Oracle, indépendamment de l&#039;existence d&#039;autres connexions.
   Les applications web à fort trafic doivent éviter d&#039;utiliser
   <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>, particulièrement dans les sections
   les plus chargées de l&#039;application.
  </p>
  <p class="para">
   Les connexions persistantes peuvent désormais être fermées
   par l&#039;utilisateur, permettant ainsi un meilleur contrôle des ressources
   de connexion. Les connexions persistantes peuvent maintenant être fermées
   automatiquement lorsqu&#039;aucune variable PHP ne les référence, comme ce
   pourrait être le cas à la fin d&#039;un contexte d&#039;une fonction utilisateur PHP.
   Ceci annulera toutes les transactions non validées. Ces changements dans les
   connexions persistantes font qu&#039;elles fonctionnent comme les fonctions
   non-persistantes, simplifiant l&#039;interface, permettant une plus grande
   cohérence de l&#039;application et de prévisibilité. Définir la directive
   <a href="oci8.configuration.php#ini.oci8.old-oci-close-semantics" class="link">oci8.old_oci_close_semantics</a>
   à <em>On</em> pour retrouver le comportement historique.
  </p>
  <p class="para">
   Le ré-établissement automatique des connexions persistantes PHP
   après le redémarrage d&#039;un processus Apache ou FPM fait que les triggers
   <code class="literal">LOGON</code> sont uniquement recommandés pour définir
   les attributs de session et non les requêtes de connexions utilisateurs
   par application.
  </p>
 </div>
 <div class="section">
  <h2 class="title">Pool de connexion DRCP</h2>
  <p class="para">
   PHP supporte le pool de connexions résidentes
   Oracle (DRCP). DRCP permet d&#039;utiliser plus efficacement la mémoire de la base de données
   et permet une meilleure évolution. Peu ou pas de modifications sont nécessaires
   afin de profiter de DRCP.
  </p>
  <p class="para">
   DRCP est prévu pour les applications qui se connectent en utilisant peu
   de schéma de base de données, et qui conservent les connexions ouvertes
   sur une courte période de temps. Les autres applications doivent
   utiliser le processus dédié à la base de données Oracle, ou utiliser
   les serveurs partagés.
  </p>
  <p class="para">
   DRCP bénéficie des 3 fonctions de connexion, mais seule la fonction
   <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> offre le plus de performance.
  </p>
  <p class="para">
   Pour rendre DRCP disponible avec OCI8, la version des bibliothèques clientes Oracle
   utilisées par PHP ainsi que la version de la base de données Oracle
   doivent être 11g ou supérieure.
  </p>
  <p class="para">
   La documentation sur DRCP peut être trouvée dans les différents manuels
   Oracle. Par exemple, se reporter à la
   <a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/database-resident-connection-pooling.html" class="link external">&raquo;&nbsp;configuration du pool
    de connexions résidentes à la base de données</a> de la documentation
   Oracle pour un exemple d&#039;utilisation.
   Un <a href="https://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf" class="link external">&raquo;&nbsp;livre blanc sur DRCP</a>
   contient plusieurs informations internes sur DRCP.
  </p>
  <p class="para">
   Pour utiliser DRCP, installez l&#039;extension OCI8 et les
   bibliothèques Oracle 11g (ou ultérieur), puis, suivre ces étapes :
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      En utilisant les privilèges d&#039;administrateur de la base de données,
      utiliser un programme comme SQL*Plus pour commencer un pool
      de connexion à la base de données :
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    SQL&gt; execute dbms_connection_pool.start_pool;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Optionnellement, utiliser <code class="literal">dbms_connection_pool.alter_param()</code>
      pour configurer les options DRCP. Les options courantes du pool
      peuvent être trouvées en utilisant la vue <code class="literal">DBA_CPOOL_INFO</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Mettre à jour les chaînes de connexion utilisées. Pour les applications PHP
      qui se connectent actuellement via un nom de connexion réseau comme
      <code class="literal">MYDB</code>:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;myuser&quot;, &quot;mypassword&quot;, &quot;MYDB&quot;);
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      modifiez le fichier tnsnames.ora et ajoutez une clause
      <code class="literal">(SERVER=POOLED)</code>, par exemple :
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
           (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
           (SERVER=POOLED)))
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      Sinon, il est possible de modifier la syntaxe de connexion facile en PHP et ajouter
      <code class="literal">:POOLED</code> après le nom du service :
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;myuser&quot;, &quot;mypassword&quot;, &quot;myhost.dom.com:1521/sales:POOLED&quot;);
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Éditez <var class="filename">php.ini</var> et choisissez le nom de la classe de connexion.
      Ce nom indique une division logique du pool de connexion et peut
      être utilisé pour isoler le pool des différentes applications.
      Toutes applications PHP utilisant le même utilisateur ainsi que
      la même valeur de classe de connexion pourront se partager
      le pool de connexions, permettant ainsi d&#039;obtenir une plus grande
      disponibilité.
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    oci8.connection_class = &quot;MY_APPLICATION_NAME&quot;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Exécuter l&#039;application, se connecter à la base de données
      11g (ou supérieur).
     </p>
    </li>
   </ul>
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Les applications utilisant Oracle Client libraries 10g qui ont besoin de la performance
    des connexions persistantes, peuvent réduire la quantité de mémoire
    allouée au serveur de la base de données en utilisant les serveurs
    partagés Oracle (connu auparavant comme serveurs multithreadés).
    Se reporter à la documentation Oracle pour plus d&#039;informations.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    La modification d&#039;un mot de passe lors de connexions DRCP échouera
    avec l&#039;erreur &quot;<em>ORA-56609: Usage not supported with DRCP</em>&quot;.
    Ceci est une restriction documentée de la base de données Oracle 11g.
   </p>
  </p></blockquote>
 </div>
</div>
<?php manual_footer($setup); ?>