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