Files
doc-fr/reference/oci8/connection.xml
2022-05-27 17:46:58 -04:00

267 lines
11 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 5fcbcd6b56477034278a2199a8819635f3a0d9b9 Maintainer: yannick Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="oci8.connection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Gestion de la connexion OCI8 et de la mise en file d'attente</title>
<section>
<title>Fonctions de connexion</title>
<para>
L'extension oci8 fournit trois fonctions différentes pour se connecter
à Oracle. La fonction de connexion standard est la fonction
<function>oci_connect</function>. 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.
</para>
<para>
La connexion à un serveur Oracle est une opération raisonnablement coûteuse
en terme de temps que cela nécessite. La fonction <function>oci_pconnect</function>
utilise un cache persistant de connexions qui peut être réutilisé à travers
différents scripts. Cela signifie qu'une seule connexion sera utilisée par
processus PHP (ou un fils Apache).
</para>
<para>
Si votre 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 <function>oci_pconnect</function> devient moins approprié
car l'augmentation du nombre d'utilisateurs concurrents va affecter les performances
de votre serveur Oracle, car il devra maintenir trop de connexions en cache.
Si votre application est de ce type, il est recommandé d'optimiser votre application
en utilisant les options de configuration <link
linkend="ini.oci8.max-persistent">oci8.max_persistent</link> et <link
linkend="ini.oci8.persistent-timeout">oci8.persistent_timeout</link>
(elles vous donnent le contrôle sur la taille et la durée de vie du cache
de connexions persistantes) ou utilisez le pool de connexions résidentes d'Oracle
(pour les bases de données Oracle 11g et suivants), ou encore, utilisez plutôt
la fonction<function>oci_connect</function>.
</para>
<para>
Les fonctions <function>oci_connect</function> et <function>oci_pconnect</function>
emploient un cache de connexions ; si vous faites des appels multiples
à <function>oci_connect</function>, en utilisant les mêmes paramètres dans
un script donné, le second appel ainsi que les suivants retourneront le gestionnaire
de connexion existant. Le cache utilisé par la fonction <function>oci_connect</function>
est nettoyé à la fin de l'exécution du script ou lorsque vous fermez explicitement
le gestionnaire de connexion. <function>oci_pconnect</function> a un comportement
sensiblement identique, à la différence que le cache est maintenu séparément
et est conservé entre les requêtes HTTP.
</para>
<para>
Il est important de se souvenir de cette fonctionnalité de cache, car il donne
l'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 votre connexion a besoin de deux connexions séparées, isolées
au niveau des transactions, vous devez utiliser la fonction <function>oci_new_connect</function>.
</para>
<para>
Le cache de la fonction <function>oci_pconnect</function> est effacé
et toutes les connexions à la base de données sont closes lorsque le processus
PHP se termine, aussi, les connexions persistantes n'ont d'intérêts que lors
de l'utilisation de PHP comme module Apache ou utilisé avec FPM ou similaire.
Les connexions persistantes n'ont aucun intérêts via <function>oci_connect</function>
lorsque PHP est utilisé comme CGI ou en ligne de commande.
</para>
<para>
<function>oci_new_connect</function> crée toujours une nouvelle connexion au
serveur Oracle, indépendamment de l'existence d'autres connexions.
Les applications web à fort trafic doivent éviter d'utiliser
<function>oci_new_connect</function>, particulièrement dans les sections
les plus chargées de l'application.
</para>
<para>
Depuis OCI8 1.3, les connexions persistantes peuvent désormais être fermées
par l'utilisateur, permettant ainsi un meilleur contrôle des ressources
de connexion. Les connexions persistantes peuvent maintenant être fermées
automatiquement lorsqu'aucune variable PHP ne les références, comme ce
pourrait être le cas à la fin d'un contexte d'une fonction utilisateur PHP.
Ceci annulera toutes les transactions non validées. Ces changements dans les
connexions persistantes font qu'elles fonctionnent comme les fonctions
non-persistantes, simplifiant l'interface, permettant une plus grande
cohérence de l'application et de prévisibilité. Définissez la directive
<link linkend="ini.oci8.old-oci-close-semantics">oci8.old_oci_close_semantics</link>
à <emphasis>On</emphasis> pour retrouver le comportement historique.
</para>
<para>
Le ré-établissement automatique des connexions persistantes PHP
après le redémarrage d'un processus Apache ou FPM fait que les triggers
<literal>LOGON</literal> sont uniquement recommandés pour définir
les attributs de session et non les requêtes de connexions utilisateurs
par application.
</para>
</section>
<section>
<title>Pool de connexion DRCP</title>
<para>
PHP, depuis la version 5.3, (PECL OCI8 1.3) supporte le pool de connexion résidentes
Oracle (DRCP). DRCP permet d'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.
</para>
<para>
DRCP est prévu pour les applications qui se connecte en utilisant peu
de schéma de base de données, et qui conserve 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.
</para>
<para>
DRCP bénéfice des 3 fonctions de connexion, mais seule la fonction
<function>oci_pconnect</function> offre le plus de performance.
</para>
<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.
</para>
<para>
La documentation sur DRCP peut être trouvé dans les différents manuels
Oracle. Par exemple, reportez-vous à la
<link xlink:href="&url.oracle.drcp.configure;">configuration du pool
de connexions résidentes à la base de données</link> de la documentation
Oracle pour un exemple d'utilisation.
Un <link xlink:href="&url.oracle.drcp.whitepaper;">livre blanc sur DRCP</link>
contient plusieurs informations internes sur DRCP.
</para>
<para>
Pour utiliser DRCP, installez l'extension OCI8 1.3 (ou ultérieur) et les
bibliothèques Oracle 11g (ou ultérieur), puis, suivre ces étapes :
</para>
<para>
<itemizedlist>
<listitem>
<para>
En utilisant les privilèges d'administrateur de la base de données,
utilisez un programme comme SQL*Plus pour commencer un pool
de connexion à la base de données :
</para>
<para>
<informalexample>
<screen>
<![CDATA[
SQL> execute dbms_connection_pool.start_pool;
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Optionnellement, utilisez <literal>dbms_connection_pool.alter_param()</literal>
pour configurer les options DRCP. Les options courantes du pool
peuvent être trouvées en utilisant la vue <literal>DBA_CPOOL_INFO</literal>.
</para>
</listitem>
<listitem>
<para>
Mettre à jour les chaînes de connexion utilisées. Pour les applications PHP
qui se connecte actuellement via un nom de connexion réseau comme
<literal>MYDB</literal>:
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("myuser", "mypassword", "MYDB");
]]>
</screen>
</informalexample>
</para>
<para>
modifiez le fichier tnsnames.ora file et ajoutez une clause
<literal>(SERVER=POOLED)</literal>, par exemple :
</para>
<para>
<informalexample>
<screen>
<![CDATA[
MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
(SERVER=POOLED)))
]]>
</screen>
</informalexample>
</para>
<para>
Sinon, vous pouvez modifier la syntaxe de connexion facile en PHP et ajouter
<literal>:POOLED</literal> après le nom du service :
</para>
<para>
<informalexample>
<screen>
<![CDATA[
$c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Éditez &php.ini; 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'obtenir une plus grande
disponibilité.
</para>
<para>
<informalexample>
<screen>
<![CDATA[
oci8.connection_class = "MY_APPLICATION_NAME"
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Exécutez votre application, connectez-vous à la base de données
11g (ou supérieur).
</para>
</listitem>
</itemizedlist>
</para>
<note>
<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).
Reportez-vous à la documentation Oracle pour plus d'informations.
</para>
</note>
<note>
<para>
La modification d'un mot de passe lors de connexions DRCP échouera
avec l'erreur "<emphasis>ORA-56609: Usage not supported with DRCP</emphasis>".
Ceci est une restriction documentée de la base de données Oracle 11g.
</para>
</note>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->