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)