## Connexions

Le serveur MySQL supporte l'utilisation de différentes couches de transport pour les connexions. Les connexions peuvent utiliser TCP/IP, les sockets de domaine Unix ou les pipes nommés Windows.

Le nom d'hôte `localhost` a une signification particulière. Il est lié à l'utilisation des sockets de domaine Unix. Pour ouvrir une connexion TCP/IP sur l'hôte local, `127.0.0.1` doit être utilisé au lieu de `localhost`.

Exemple #1 Signification spéciale de localhost

`<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
echo $mysqli->host_info . "\n";`

L'exemple ci-dessus va afficher :

    Localhost via UNIX socket
    127.0.0.1 via TCP/IP

Paramètres par défaut d'une connexion

Suivant la fonction de connexion utilisée, des paramètres peuvent être omis. Si un paramètre n'est pas fourni, alors l'extension tentera d'utiliser les valeurs par défaut définies dans le fichier de configuration de PHP.

Exemple #2 Paramètres par défaut

    mysqli.default_host=192.168.2.27
    mysqli.default_user=root
    mysqli.default_pw=""
    mysqli.default_port=3306
    mysqli.default_socket=/tmp/mysql.sock

Ces valeurs de paramètres sont alors passées à la bibliothèque cliente utilisée par l'extension. Si la bibliothèque cliente détecte un paramètre vide ou non défini, alors elle utilisera les valeurs par défaut internes à la bibliothèque.

Valeurs par défaut internes à la bibliothèque pour la connexion

Si la valeur de l'hôte n'est pas définie ou est vide, alors la bibliothèque cliente utilisera par défaut une connexion de type socket Unix sur `localhost`. Si le socket n'est pas défini ou vide, et qu'une connexion de type socket Unix est demandée, alors une connexion au socket par défaut `/tmp/mysql.sock` sera tentée.

Sous les systèmes Windows, le nom d'hôte `.` est interprété par la bibliothèque cliente comme une tentative d'ouvrir un tube nommé Windows pour la connexion. Dans ce cas, le paramètre socket est interprété comme un tube nommé. S'il n'est pas fourni ou vide, alors le socket (tube nommé) vaudra par défaut `\\.\pipe\MySQL`.

Si ni un socket de domaine Unix, ni un tube nommé Windows n'est fourni, une connexion de base sera établie et si la valeur du port n'est pas défini, la bibliothèque utilisera le port `3306`.

La bibliothèque mysqlnd et la bibliothèque cliente MySQL (libmysqlclient) implémentent la même logique pour déterminer les valeurs par défaut.

Options de connexion

Des options de connexion sont disponibles pour, par exemple, définir des commandes d'initialisation à exécuter lors de la connexion, ou pour demander l'utilisation d'un jeu de caractères particulier. Les options de connexion doivent être définies avant la connexion au réseau.

Pour définir une option de connexion, l'opération de connexion doit être effectuée en 3 étapes : création d'un gestionnaire de connexion avec mysqli_init() ou mysqli::__construct(), définition des options demandées en utilisant mysqli::options(), et connexion au réseau avec mysqli::real_connect().

File d'attente de connexion

L'extension mysqli supporte les connexions persistantes au base de données, qui sont des connexions spéciales. Par défaut, chaque connexion à une base de données ouverte par un script est soit explicitement close par l'utilisateur durant l'exécution, ou soit libérée automatiquement à la fin du script. Ce n'est pas le cas d'une connexion persistante. En effet, elle sera placée dans une file d'attente pour une ré-utilisation future, si une connexion au même serveur, utilisant le même nom d'utilisateur, le même mot de passe, le même socket, le même port, ainsi que la même base de données est ouverte. Cette ré-utilisation permet d'alléger la charge indue par les connexions.

Chaque processus PHP utilise sa propre file d'attente de connexions mysqli. Suivant le modèle de déploiement du serveur web, un processus PHP peut servir une ou plusieurs requêtes. Toutefois, une connexion mise en file d'attente peut être utilisée par un ou plusieurs scripts par la suite.

Les connexions persistantes

Si une connexion persistante pour une combinaison d'hôte, de nom d'utilisateur, de mot de passe, de socket, de port et de base de données inutilisée ne peut être trouvée dans la file d'attente de connexion, alors mysqli ouvrira une nouvelle connexion. L'utilisation des connexions persistantes peut être activée ou désactivée en utilisant la directive PHP mysqli.allow_persistent. Le nombre total de connexions ouvertes par un script peut être limité avec la directive mysqli.max_links. Le nombre maximal de connexions persistantes par processus PHP peut être restreint avec la directive mysqli.max_persistent. Veuillez noter que le serveur web peut engendrer plusieurs processus PHP.

Une plainte courante contre les connexions persistantes est que leurs statuts n'est pas ré-initialisés avant la ré-utilisation. Par exemple, les transactions ouvertes et non terminées ne sont pas automatiquement annulées. Mais aussi, les modifications autorisées survenant entre le moment où la connexion est mise en file d'attente et sa ré-utilisation ne seront pas prises en compte. Ce comportement peut être vu comme un effet de bord non désiré. Au contraire, le nom `persistent` peut être compris comme une promesse sur le fait que le statut persiste réellement.

L'extension mysqli supporte deux interprétations d'une connexion persistante : statut persistant, et un statut réinitialisé avant ré-utilisation. Par défaut, il sera réinitialisé. Avant qu'une connexion persistante ne soit réutilisée, l'extension mysqli appelle implicitement la fonction mysqli::change_user() pour réinitialiser le statut. La connexion persistante apparaît à l'utilisateur comme si elle venait juste d'être ouverte. Aucune trace d'une utilisation précédente ne sera visible.

La fonction mysqli::change_user() est une opération couteuse. Pour de meilleures performances, les utilisateurs peuvent vouloir re-compiler l'extension avec le drapeau de compilation `MYSQLI_NO_CHANGE_USER_ON_PCONNECT`.

Ainsi, il sera laissé à l'utilisateur le choix entre un comportement sécurisé et une performance optimisée. Les deux ont comme but l'optimisation. Pour une utilisation plus simple, le comportement sécurisé a été placé par défaut au détriment d'une performance maximale.

Voir aussi

- mysqli_init()
- mysqli::__construct()
- mysqli::options()
- mysqli::real_connect()
- mysqli::change_user()
- $mysqli::host_info
- Les options de configuration MySQLi
- Les connexions persistantes aux bases de données