Groupe de connexions et bascule entre les connexions
Le plugin de réplication et répartition de charge change la sémantique d'une connexion MySQL de PHP. Les API existantes des extensions PHP pour MySQL (mysqli, mysql et PDO_MYSQL) sont inchangées, mais leur comportement est modifié lorsque le plugin est utilisé. Les applications existantes n'ont pas de changement à opérer pour utiliser la nouvelle API, mais elles devront peut-être être modifiées en ce qui concerne le comportement du plugin.
Le plugin casse la relation un-à-un entre une connexion mysqli, mysql et PDO_MYSQL et la connexion réseau à MySQL. Lorsque le plugin est utilisé, la connexion de mysqli, mysql, PDO_MYSQL représente en fait un groupe de connexions vers un serveur maitre MySQL et des serveurs esclaves. Le plugin aiguille les requêtes vers le serveur maitre ou un des esclaves. A un moment donné, une connexion vue depuis PHP peut pointer vers le maitre et juste après vers un esclave, ou alors toujours le maitre. La manipulation et le remplacement d'une connexion réseau référencée par un gestionnaire de connexion PHP MySQL n'est pas une opération transparente.
Chaque connexion MySQL possède un état, et les différentes connexions, gérées dans un groupe par le plugin, peuvent avoir chacune des états différents. Lorsque le plugin bascule d'une connexion à une autre, l'état est susceptible de changer. L'application doit prendre cela en compte.
La liste suivante indique ce qui est caractérisé par un état de connexion. Cette liste peut ne pas être totalement complète.
- Les statuts des transactions
- Les tables temporaires
- Les verrous des tables
- Les variables de session système ou utilisateur
- Le jeu de bases de données courantes, utilisant USE ainsi que d'autres commandes de statut SQL
- Les requêtes préparées
- Les variables HANDLER
- Les verrous retournés par GET_LOCK()
Le changement de connexions intervient juste avant l'exécution de la requête. Le plugin ne change la connexion courante qu'au moment où la prochaine requête est exécutée.
Note: Problèmes liés à la réplication
Voyez aussi le manuel de référence de MySQL concernant » la réplication et ses problématiques. Certaines restrictions ne sont pas dûes au plugin PHP mais sont des caractéristiques du mécanisme de réplication de MySQL.
Messages diffusés
La philosophie du plugin est d'aligner le statut des connexions dans la file d'attente uniquement si le statut est sous le contrôle total du plugin, ou si c'est nécessaire d'un point de vue de la sécurité. Seulement quelques actions modifiants le statut de la connexion rentrent dans cette catégorie.
Voici la liste des appels diffusés de la bibliothèques clientes qui modifient le statut de toutes les connexions contenus dans la file d'attente.
Si un des appels listés ci-dessous est exécuté, le plugin parcourt toutes les connexions actuellement ouvertes vers le maître et les esclaves. Le parcourt continue tant que tous les serveurs n'ont pas été contactés. Le parcourt ne s'interrompt pas lorsqu'un des serveurs indique une erreur. Si possible, l'erreur sera propagée pour appeler la fonction de l'API utilisateur. Suivant cette fonction, qui a été lancée par la fonction de la bibliothèque sous-jacente, l'utilisateur peut être capable de détecter l'erreur.
Appel de la bibliothèque | Notes | Version |
---|---|---|
change_user() | Appelé par l'appel de l'API utilisateur mysqli_change_user(). Également émise lors de la réutilisation d'une connexion mysqli persistante. | Depuis la version 1.0.0. |
select_db | Appelé par les appels de l'API utilisateur suivants : mysql_select_db(), mysql_list_tables(), mysql_db_query(), mysql_list_fields(), mysqli_select_db(). Notez que USE n'est pas surveillé. | Depuis la version 1.0.0. |
set_charset() | Appelé par les appels de l'API utilisateur suivants : mysql_set_charset(). mysqli_set_charset(). Notez que SET NAMES n'est pas surveillé. | Depuis la version 1.0.0. |
set_server_option() | Appelé par les appels de l'API utilisateur suivants : mysqli_multi_query(), mysqli_real_query(), mysqli_query(), mysql_query(). | Depuis la version 1.0.0. |
set_client_option() | Appelé par les appels de l'API utilisateur suivants : mysqli_options(), mysqli_ssl_set(), mysqli_connect(), mysql_connect(), mysql_pconnect(). | Depuis la version 1.0.0. |
set_autocommit() | Appelé par les appels de l'API utilisateur suivants : mysqli_autocommit(), PDO::setAttribute(PDO::ATTR_AUTOCOMMIT). | Depuis la version 1.0.0. PHP >= 5.4.0. |
ssl_set() | Appelé par les appels de l'API utilisateur suivants : mysqli_ssl_set(). | Depuis la version 1.1.0. |
Les connexions diffusées et paresseuses
Le plugin n'utilise pas de proxy ou bien ne se "souvient" pas de toutes les configurations à appliquer aux futures connexions. Il est important de se rappeler de cela lors de l'utilisation des connexions paresseuses. Les connexions paresseuses sont des connexions qui ne sont pas ouvertes tant que le client n'envoie pas la première connexion. Le plugin utilise par défaut de telles connexions.
Les appels de la bibliothèque modifiant la configuration et le statut des connexions ci-après sont enregistrés pour être utilisés lors de l'ouverture d'une connexion paresseuse afin de s'assurer que le statut de cette connexion est comparable avec le statut de toutes les connexions de la file d'attente.
Appel de la bibliothèque | Notes | Version |
---|---|---|
change_user() | Utilisateur, mot de passe et base de données sont enregistrés pour une utilisation ultérieure. | Depuis la version 1.1.0. |
select_db | Base de données enregistré pour utilisation ultérieure. | Depuis la version 1.1.0. |
set_charset() | Appel set_client_option(MYSQL_SET_CHARSET_NAME, charset) sur les connexions paresseuses pour s'assurer que charset sera utilisé lors de l'ouverture d'une connexion paresseuse. | Depuis la version 1.1.0. |
set_autocommit() | Ajoute SET AUTOCOMMIT=0|1 à la liste des commandes d'initialisation pour une connexion paresseuse utilisant set_client_option(MYSQL_INIT_COMMAND, "SET AUTOCOMMIT=...%quot;). | Depuis la version 1.1.0. PHP >= 5.4.0. |
Statut de connexion
Notez que le statut de la connexion n'est pas changé que par des appels API. Aussi, même si PECL mysqlnd_ms surveille tous les appels API, l'application a toujours besoin de maintenir le statut de la connexion, si besoin.
Jeux de caractères et échappement des chaînes
En raison de l'utilisation des connexions paresseuses, qui sont actives par défaut, il peut survenir qu'une application tente d'échapper une chaîne pour une utilisation dans une requête SQL avant qu'une connexion ne soit établie. Dans ce cas, l'échappement de la chaîne n'est pas possible. La fonction d'échappement de chaînes ne connait pas le jeu de caractères à utiliser avant qu'une connexion ne soit établie.
Pour éviter ce problème, une nouvelle option de configuration server_charset a été introduite en version 1.4.0.
Une attention particulière doit être portée lors de l'échappement de chaînes avec un certain jeu de caractères, mais utilisant le résultat sur une connexion qui utilise un jeu de caractères différent. Notez que PECL/mysqlnd_ms manipule les connexions et qu'une connexion au niveau applicatif représente une file de plusieurs connexions qui peuvent avoir différents jeux de caractères par défaut. Il est recommandé de configurer le serveur pour utiliser le même jeu de caractères par défaut. L'option de configuration server_charset va être utile dans cette situation. Si vous utilisez l'option server_charset, le plugin va définir le jeu de caractères fourni sur toutes les nouvelles connexions ouvertes.
Version en cache
24/12/2024 00:07:36 Cette version de la page est en cache (à la date du 24/12/2024 00:07:36) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-mysqlnd-ms.pooling.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.