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
<?php mysqlnd_uh_set_connection_proxy(new MysqlndUhConnection()); $mysqli = new mysqli("localhost", "root", "", "test"); ?>
<?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", ""); ?>
<?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)