Installation d'un proxy
L'extension fournit 2 classes internes : MysqlndUhConnection et MysqlndUhPreparedStatement. Les classes sont utilisées pour intercepter les appels à la bibliothèque mysqlnd. Leurs méthodes correspondent aux fonctions internes de mysqlnd. Par défaut, elles fonnctionnent comme un pproxy transparent et ne font rien mise à part appeler les homologues mysqlnd. En surchargeant les classes, vous pouvez installer votre propre proxy pour surveiller mysqlnd.
Voir aussi le guide sur le fonctionnement interne de cette extension.
Les proxies de connexions sont des objets de type MysqlndUhConnection. Les objets de proxy de connexion sont installés avec la fonction mysqlnd_uh_set_connection_proxy(). Si vous installez la classe interne MysqlndUhConnection comme proxy, rien ne surviendra. Elle fonctionne comme un proxy transparent.
Exemple #1 Enregistration du proxy, mysqlnd_uh.enable=1
<?php
mysqlnd_uh_set_connection_proxy(new MysqlndUhConnection());
$mysqli = new mysqli("localhost", "root", "", "test");
?>
La directive de configuration PHP_INI_SYSTEM mysqlnd_uh.enable contrôle si un proxy doit être défini. Si désactivé, l'extension va émettre une erreur de niveau E_WARNING.
Exemple #2 Installation d'un proxy désactivée
mysqlnd_uh.enable=0
<?php
mysqlnd_uh_set_connection_proxy(new MysqlndUhConnection());
$mysqli = new mysqli("localhost", "root", "", "test");
?>
L'exemple ci-dessus va afficher :
PHP Warning: MysqlndUhConnection::__construct(): (Mysqlnd User Handler) The plugin has been disabled by setting the configuration parameter mysqlnd_uh.enabled = false. You must not use any of the base classes in %s on line %d PHP Warning: mysqlnd_uh_set_connection_proxy(): (Mysqlnd User Handler) The plugin has been disabled by setting the configuration parameter mysqlnd_uh.enable = false. The proxy has not been installed in %s on line %d
Pour monitorer mysqlnd, vous devez écrire votre propre objet proxy en surchargeant la classe MysqlndUhConnection. Reportez-vous à la section référence des fonctions pour une liste de toutes les méthodes qui peuvent être surchargées. Sinon, vous pouvez utiliser la réflection pour inspecter la classe interne MysqlndUhConnection.
Crée une nouvelle classe proxy. Dérivez-la depuis la classe interne MysqlndUhConnection. Remplacez la méthode MysqlndUhConnection::connect(). Affichez la valeur du paramètre hôte passée à la méthode. Assurez-vous que vous appelez l'implémentation parente de la méthode connect. Si vous ne le faîtes pas, vous obtiendrez des résultats non prévisibles et surtout non désirés, incluant un crash mémoire ou une fuite mémoire.
Enregistrez votre proxy et ouvrez trois connexions en utilisant les extensions PHP MySQL mysqli, mysql, et PDO_MYSQL. Si ces extensions ont été compilées pour utiliser la bibliothèque mysqlnd, la méthode proxy::connect sera appelée trois fois, une fois par connexion ouverte.
Exemple #3 Proxy de connexion
<?php
class proxy extends MysqlndUhConnection {
public function connect($res, $host, $user, $passwd, $db, $port, $socket, $mysql_flags) {
printf("Connexion ouverte vers '%s'\n", $host);
/* Appelez toujours l'implémentation parente ! */
return parent::connect($res, $host, $user, $passwd, $db, $port, $socket, $mysql_flags);
}
}
mysqlnd_uh_set_connection_proxy(new proxy());
$mysqli = new mysqli("localhost", "root", "", "test");
$mysql = mysql_connect("localhost", "root", "");
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
?>
L'exemple ci-dessus va afficher :
Connexion ouverte vers 'localhost' Connexion ouverte vers 'localhost' Connexion ouverte vers 'localhost'
L'utilisation de proxies de requête préparée suit le même masque : créez un objet proxy de type MysqlndUhPreparedStatement et installez le proxy en utilisant la fonction mysqlnd_uh_set_statement_proxy().
Exemple #4 Proxy de requête préparée
<?php
class stmt_proxy extends MysqlndUhPreparedStatement {
public function prepare($res, $query) {
printf("%s(%s)\n", __METHOD__, $query);
return parent::prepare($res, $query);
}
}
mysqlnd_uh_set_statement_proxy(new stmt_proxy());
$mysqli = new mysqli("localhost", "root", "", "test");
$stmt = $mysqli->prepare("SELECT 'mysqlnd hacking made easy' AS _msg FROM DUAL");
?>
L'exemple ci-dessus va afficher :
stmt_proxy::prepare(SELECT 'mysqlnd hacking made easy' AS _msg FROM DUAL)
Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-mysqlnd-uh.quickstart.proxy-installation.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.