|
1 | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | | -<!-- $Revision$ --> |
3 | | -<!-- EN-Revision: 0799f7789c50a11b746ad713cc8787e4b04dd926 Maintainer: yannick Status: ready --> |
| 2 | +<!-- EN-Revision: e7e4ffe9a10a4dcd9903a7abf125a811d0eda023 Maintainer: yannick Status: ready --> |
4 | 3 | <!-- Reviewed: yes --> |
5 | 4 |
|
6 | 5 | <chapter xml:id="features.persistent-connections" xmlns="http://docbook.org/ns/docbook"> |
7 | 6 | <title>Connexions persistantes aux bases de données</title> |
| 7 | + |
| 8 | +<simplesect> |
| 9 | + <title>Qu'est-ce que les connexions persistantes ?</title> |
8 | 10 | <simpara> |
9 | 11 | Les connexions persistantes aux bases de données SQL sont |
10 | 12 | des connexions qui ne se referment pas à la fin du script. |
|
18 | 20 | sont nécessaires). |
19 | 21 | </simpara> |
20 | 22 | <simpara> |
21 | | - Ceux qui ne sont pas rompus aux techniques des serveurs web et leur |
22 | | - distribution de la charge de travail se font parfois une fausse |
23 | | - idée de ces connexions persistantes. En particulier, |
24 | | - les connexions persistantes <emphasis>ne permettent pas</emphasis> |
25 | | - l'ouverture de plusieurs sessions avec le même lien ; |
26 | | - elles <emphasis>ne permettent pas</emphasis> la réalisation |
27 | | - de transactions efficaces et ne font pas le café. En fait, |
28 | | - pour être extrêmement clair sur le sujet, les |
29 | | - connexions persistantes <emphasis>ne vous donnent</emphasis> |
30 | | - aucune fonctionnalité |
31 | | - de plus que les connexions non persistantes. |
| 23 | + Il n'y a pas de méthode pour demander une connexion spécifique, ou garantir |
| 24 | + que vous obtenez une connexion existante ou une toute nouvelle (si toutes les |
| 25 | + connexions sont utilisées, ou si la requête est servie par un autre processus, |
| 26 | + qui a un ensemble de connexions séparé). |
32 | 27 | </simpara> |
33 | 28 | <simpara> |
34 | | - Alors pourquoi les connexions persistantes ? |
| 29 | + Cela signifie que vous ne pouvez pas utiliser les connexions persistantes PHP pour, par exemple : |
35 | 30 | </simpara> |
| 31 | + <simplelist> |
| 32 | + <member>assigner une session de base de données spécifique à un utilisateur web spécifique</member> |
| 33 | + <member>créer une grande transaction à travers plusieurs requêtes</member> |
| 34 | + <member>initier une requête sur une demande et collecter les résultats sur une autre</member> |
| 35 | + </simplelist> |
36 | 36 | <simpara> |
37 | | - Cela s'explique par la manière avec laquelle les serveurs web |
38 | | - fonctionnent. Il y a trois manières d'utiliser PHP pour |
39 | | - générer des pages. |
| 37 | + Les connexions persistantes ne vous donnent <emphasis>aucune</emphasis> |
| 38 | + fonctionnalité qui n'était pas possible avec des connexions non persistantes. |
| 39 | + </simpara> |
| 40 | +</simplesect> |
| 41 | + |
| 42 | +<simplesect xml:id="persistent-connections.web"> |
| 43 | + <title>Requêtes Web</title> |
| 44 | + <simpara> |
| 45 | + Il existe deux façons pour votre serveur web d'utiliser PHP pour générer |
| 46 | + des pages web : |
40 | 47 | </simpara> |
41 | 48 | <simpara> |
42 | 49 | La première est d'utiliser PHP comme un CGI (Common Interface Gateway). |
|
45 | 52 | pour chaque page demandée. Étant donné que cet interpréteur est |
46 | 53 | détruit après chaque requête, toutes les |
47 | 54 | ressources acquises (comme une connexion à une base SQL), |
48 | | - sont purement et simplement détruites. |
| 55 | + sont purement et simplement détruites. Dans ce cas vous ne |
| 56 | + gagnez rien à utiliser des connexions persistantes - elles ne persistent tout simplement pas. |
49 | 57 | </simpara> |
50 | 58 | <simpara> |
51 | | - La deuxième méthode, de loin la plus prisée, |
52 | | - est d'exécuter PHP sous la forme d'un module sur un serveur |
53 | | - multiprocessus, ce qui revient à dire : Apache. Un tel serveur |
54 | | - a typiquement un processus parent qui coordonne un ensemble de processus fils, |
| 59 | + La deuxième méthode, de loin la plus prisée, est d'exécuter PHP-FPM, ou PHP sous la forme d'un |
| 60 | + module sur un serveur multiprocessus, ce qui revient à dire : Apache. |
| 61 | + Ces configurations ont généralement un processus (le parent) qui |
| 62 | + coordonne un ensemble de processus fils, |
55 | 63 | qui servent les fichiers. Lorsque les requêtes parviennent depuis |
56 | 64 | un client, elles sont transmises à un fils disponible. Cela signifie |
57 | 65 | que si un client fait une deuxième requête, il peut |
|
61 | 69 | ultérieures, les processus fils pourront réutiliser la |
62 | 70 | connexion ouverte précédemment. |
63 | 71 | </simpara> |
| 72 | + <note> |
| 73 | + <para> |
| 74 | + Vous pouvez vérifier quelle méthode vos requêtes web utilisent en vérifiant la valeur de |
| 75 | + "Server API" dans la sortie de <function>phpinfo</function> ou la valeur de |
| 76 | + <constant>PHP_SAPI</constant>, exécutée depuis une requête web. |
| 77 | + </para> |
| 78 | + <para> |
| 79 | + Si la valeur de Server API est "CGI" ou "CLI", alors les connexions |
| 80 | + persistantes ne seront pas utilisées entre les requêtes. Pour toute autre |
| 81 | + valeur, les connexions persistantes persisteront après chaque requête. |
| 82 | + </para> |
| 83 | + </note> |
| 84 | +</simplesect> |
| 85 | + |
| 86 | +<simplesect xml:id="persistent-connections.cli"> |
| 87 | + <title>Processus en ligne de commande</title> |
64 | 88 | <simpara> |
65 | | - La dernière méthode est d'utiliser PHP sous la forme d'un |
66 | | - module de serveur multithread. Actuellement, PHP supporte |
67 | | - WSAPI, et NSAPI (sous Windows), qui permettent tous d'utiliser |
68 | | - PHP comme un module sur un serveur multithread tel que Netscape |
69 | | - FastTrack (iPlanet), Microsoft Internet Information Server (IIS), et |
70 | | - O'Reilly's WebSite Pro. Le comportement est essentiellement le même |
71 | | - que pour les serveurs multiprocessus décrits précédemment. |
72 | | - </simpara> |
73 | | - <simpara> |
74 | | - Si les connexions persistantes n'ont aucune fonctionnalité de plus, |
75 | | - à quoi servent-elles ? |
| 89 | + Comme PHP en ligne de commande utilise un nouveau processus pour chaque script, |
| 90 | + les connexions persistantes ne sont pas partagées entre les scripts en ligne de commande, donc il n'y a aucun |
| 91 | + intérêt à les utiliser dans des scripts transitoires tels que les crons ou les commandes. |
| 92 | + Cependant, elles peuvent être utiles si, par exemple, vous écrivez un serveur d'applications |
| 93 | + de longue durée qui sert de nombreuses requêtes ou tâches et que chacune peut |
| 94 | + avoir besoin de sa propre connexion à la base de données. |
76 | 95 | </simpara> |
| 96 | + </simplesect> |
| 97 | + |
| 98 | +<simplesect xml:id="persistent-connections.why"> |
| 99 | + <title>Pourquoi les utiliser ?</title> |
77 | 100 | <simpara> |
78 | | - La réponse est extrêmement simple : efficacité. Les |
79 | | - connexions persistantes sont un bon moyen d'accélérer les |
80 | | - accès à une base SQL si le traitement de connexion à |
81 | | - la base est long. Ce temps dépend de nombreux facteurs : le type |
| 101 | + Les connexions persistantes sont utiles si le coût de création d'une liaison |
| 102 | + vers votre serveur SQL est élevé. Que ce coût soit réellement élevé ou pas ceci dépend |
| 103 | + de nombreux facteurs : le type |
82 | 104 | de base de données, cette base est-elle sur le même serveur |
83 | 105 | ou pas, quelle est la charge du serveur de base de données, etc. |
84 | 106 | Si le temps de connexion est long, les connexions persistantes seront |
|
87 | 109 | processus fils, il suffit d'avoir 20 connexions persistantes ouvertes, |
88 | 110 | une par fils. |
89 | 111 | </simpara> |
| 112 | +</simplesect> |
| 113 | + |
| 114 | +<simplesect xml:id="persistent-connections.drawbacks.conn-limits"> |
| 115 | + <title>Inconvénients potentiels : limites de connexion</title> |
90 | 116 | <simpara> |
91 | 117 | Notez que les connexions persistantes ont quelques inconvénients |
92 | 118 | si vous hébergez une base de données dont le nombre maximal de |
93 | 119 | connexion risque d'être atteint par les connexions persistantes. |
94 | 120 | Si votre base de données accepte jusqu'à 16 connexions |
95 | | - simultanées et que 17 processus essaient de se connecter, |
96 | | - le dernier restera sur la touche. S'il y a des erreurs dans les scripts qui ne permettent |
97 | | - pas de fermer la connexion (par exemple, une boucle infinie), votre |
98 | | - serveur sera rapidement engorgé. Vérifiez la documentation de votre |
99 | | - base de données pour savoir comment elle traite les connexions |
100 | | - inactives ou abandonnées. |
| 121 | + peut être rapidement submergée. |
| 122 | + </simpara> |
| 123 | + <simpara> |
| 124 | + Les connexions persistantes augmenteront généralement le nombre de connexions ouvertes |
| 125 | + à un moment donné parce que les travailleurs inactifs conserveront les connexions pour |
| 126 | + les requêtes précédentes qu'ils ont servies. Si un grand nombre de travailleurs est lancé pour |
| 127 | + gérer un afflux de requêtes, les connexions qu'ils ont ouvertes resteront jusqu'à |
| 128 | + ce que le travailleur soit tué ou que le serveur de base de données ferme la connexion. |
101 | 129 | </simpara> |
102 | | - <warning> |
103 | | - <simpara> |
104 | | - Il y a quelques autres limitations à bien garder en tête lorsque |
105 | | - vous utilisez les connexions persistantes. L'une est que lorsque |
106 | | - vous posez un verrou avec une connexion persistante, si le script ne |
107 | | - peut libérer le verrou pour une raison quelconque, alors les autres |
108 | | - scripts qui réutiliseront la connexion seront bloqués indéfiniment, |
109 | | - et vous imposeront le redémarrage du serveur ou de la base de données. |
110 | | - Une autre limitation est, lors de l'utilisation des transactions, un |
111 | | - bloc de transaction non fermé sera prolongé au script suivant, s'il |
112 | | - n'est pas fermé par le script initiateur. Dans les deux cas, |
113 | | - vous pouvez utiliser la fonction |
114 | | - <function>register_shutdown_function</function> pour enregistrer une |
115 | | - fonction simple de nettoyage, pour déverrouiller les tables, |
116 | | - et annuler les transactions en cours. Mieux encore, évitez le problème |
117 | | - entièrement en n'utilisant pas les connexions persistantes dans les |
118 | | - scripts qui ont besoin de verrous ou de transactions. Vous pourrez |
119 | | - toujours les utiliser ailleurs. |
120 | | - </simpara> |
121 | | - </warning> |
122 | 130 | <simpara> |
123 | | - Résumons-nous : les connexions persistantes ont été |
124 | | - définies pour avoir les mêmes fonctionnalités que |
125 | | - les connexions non persistantes. Les deux types de connexions |
126 | | - sont <emphasis>parfaitement interchangeables</emphasis>, |
127 | | - et <emphasis>n'affecteront pas</emphasis> le comportement de votre script |
128 | | - : uniquement son efficacité. |
| 131 | + Assurez-vous que le nombre maximal de connexions autorisées par le serveur de base de données |
| 132 | + est supérieur au nombre maximal de travailleurs de requêtes web (plus toute autre |
| 133 | + utilisation telle que les crons ou les connexions administratives). |
129 | 134 | </simpara> |
130 | | - <para> |
131 | | - Voir aussi |
132 | | - <function>ibase_pconnect</function>, |
133 | | - <function>ociplogon</function>, |
134 | | - <function>pfsockopen</function>, et |
135 | | - <function>pg_pconnect</function>. |
136 | | - </para> |
| 135 | + <simpara> |
| 136 | + Vérifiez votre documentation de base de données pour des informations sur la gestion des connexions abandonnées ou |
| 137 | + inactives (timeouts). Des timeouts longs peuvent augmenter considérablement le |
| 138 | + nombre de connexions persistantes ouvertes à un moment donné. |
| 139 | + </simpara> |
| 140 | +</simplesect> |
| 141 | + |
| 142 | + <simplesect xml:id="persistent-connections.drawbacks.state"> |
| 143 | + <title>Inconvénients potentiels : Maintien de l'état de connexion</title> |
| 144 | + <simpara> |
| 145 | + Certaines extensions de base de données effectuent un nettoyage automatique lorsque la connexion est |
| 146 | + réutilisée ; d'autres laissent cette tâche à la discrétion du développeur d'application. |
| 147 | + En fonction de l'extension de base de données choisie et de la conception de l'application, un |
| 148 | + nettoyage manuel peut être nécessaire avant la fin du script. Les modifications qui peuvent laisser |
| 149 | + les connexions dans un état inattendu incluent : |
| 150 | + </simpara> |
| 151 | + <simplelist> |
| 152 | + <member>Base de données sélectionnée / par défaut</member> |
| 153 | + <member>Verrous de table</member> |
| 154 | + <member>Transactions non commises</member> |
| 155 | + <member>Tables temporaires</member> |
| 156 | + <member>Paramètres ou fonctionnalités spécifiques à la connexion telles que le profilage</member> |
| 157 | + </simplelist> |
| 158 | + <simpara> |
| 159 | + Les verrous de table et les transactions qui ne sont pas nettoyés ou fermés peuvent |
| 160 | + entraîner le blocage indéfini d'autres requêtes et/ou provoquer |
| 161 | + des modifications inattendues lors de la réutilisation ultérieure de la connexion. |
| 162 | + </simpara> |
| 163 | + <simpara> |
| 164 | + Avoir la mauvaise base de données sélectionnée entraînera la réutilisation de |
| 165 | + la connexion incapable d'exécuter les requêtes suivantes comme prévu (ou de les exécuter sur |
| 166 | + la mauvaise base de données si les schémas sont suffisamment similaires). |
| 167 | + </simpara> |
| 168 | + <simpara> |
| 169 | + Si les tables temporaires ne sont pas nettoyées, les requêtes suivantes ne pourront pas |
| 170 | + recréer la même table. |
| 171 | + </simpara> |
| 172 | + <simpara> |
| 173 | + Vous pouvez implémenter le nettoyage en utilisant des destructeurs de classe ou |
| 174 | + <function>register_shutdown_function</function>. Vous pouvez également envisager |
| 175 | + des proxies de mise en pool de connexions dédiés qui incluent cela dans |
| 176 | + leur fonctionnalité. |
| 177 | + </simpara> |
| 178 | + </simplesect> |
| 179 | + |
| 180 | + <simplesect xml:id="persistent-connections.final-words"> |
| 181 | + <title>Derniers mots</title> |
| 182 | + <simpara> |
| 183 | + Étant donné leur comportement et les inconvénients potentiels décrits ci-dessus, vous ne devez pas |
| 184 | + utiliser les connexions persistantes sans une réflexion approfondie. Elles ne doivent pas être |
| 185 | + utilisées sans mettre en œuvre des modifications supplémentaires dans votre application et une configuration |
| 186 | + soigneuse de votre serveur de base de données et de votre serveur web et/ou PHP-FPM. |
| 187 | + </simpara> |
| 188 | + <simpara> |
| 189 | + Considérez des solutions alternatives telles que l'investigation et la correction des causes des |
| 190 | + surcoûts de création de connexion (par exemple, la désactivation des recherches DNS inverses sur |
| 191 | + le serveur de base de données), ou des proxies de mise en pool de connexions dédiés. |
| 192 | + </simpara> |
| 193 | + <simpara> |
| 194 | + Pour les API web à fort volume, envisagez d'utiliser des runtimes alternatifs ou des serveurs |
| 195 | + d'applications de longue durée. |
| 196 | + </simpara> |
| 197 | + </simplesect> |
| 198 | + |
| 199 | + <simplesect role="seealso" xml:id="persistent-connections.seealso"> |
| 200 | + &reftitle.seealso; |
| 201 | + <para> |
| 202 | + <simplelist> |
| 203 | + <member><function>ibase_pconnect</function></member> |
| 204 | + <member><function>oci_pconnect</function></member> |
| 205 | + <member><function>odbc_pconnect</function></member> |
| 206 | + <member><function>pfsockopen</function></member> |
| 207 | + <member><function>pg_connect</function></member> |
| 208 | + <member><link linkend="mysqli.persistconns">MySQLi et les connexions persistantes</link></member> |
| 209 | + <member><link linkend="pdo.connections">Gestion de connexions PDO</link></member> |
| 210 | + </simplelist> |
| 211 | + </para> |
| 212 | + </simplesect> |
137 | 213 | </chapter> |
138 | 214 |
|
139 | 215 | <!-- Keep this comment at the end of the file |
|
0 commit comments