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