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 mis à 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)