PHP Unconference Europe 2015

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. Il n'est pas possible d'ouvrir une connexion TCP/IP en utilisant le nom d'hôte localhost ; vous devez utiliser 127.0.0.1 à la place.

Exemple #1 Signification spéciale de localhost

<?php
$mysqli 
= new mysqli("localhost""user""password""database");
if (
$mysqli->connect_errno) {
    echo 
"Echec lors de la connexion à MySQL : (" $mysqli->connect_errno ") " $mysqli->connect_error;
}
echo 
$mysqli->host_info "\n";

$mysqli = new mysqli("127.0.0.1""user""password""database"3306);
if (
$mysqli->connect_errno) {
    echo 
"Echec lors de la connexion à MySQL : (" $mysqli->connect_errno ") " $mysqli->connect_error;
}

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 pipe nommé Windows pour la connexion. Dans ce cas, le paramètre socket est interprété comme un nom de pipe. S'il n'est pas fourni ou vide, alors le socket (nom du pipe) vaudra par défaut \\.\pipe\MySQL.

Si ni un socket de domaine Unix, ni un pipe nommé Windows n'est fourni, une connexion de base sera établit 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 démander 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(), définission 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 persistentes 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 persistente. 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 persistentes

Si une connexion persistente 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 persistentes 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 persistentes 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 persistentes 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 persistente : statut persistant, et un statut réinitialisé avant ré-utilisation. Par défaut, il sera réinitialisé. Avant qu'une connexion persistente ne soit réutilisée, l'extension mysqli appelle implicitement la fonction mysqli_change_user() pour réinitialiser le statut. La connexion persistente 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

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top