Comment fonctionne-t-il ?

Cette section décrit le contexte et les rouages de l'extension mysqlnd_uh.

Deux classes sont fournies par l'extension : MysqlndUhConnection et MysqlndUhPreparedStatement. MysqlndUhConnection vous permet d'accéder à la plupart des méthodes de la classe interne connection de mysqlnd. La seconde expose quelques méthodes sélectionnées de la classe statement interne à mysqlnd. Par exemple, la méthode MysqlndUhConnection::connect() est liée à la fonction C mysqlnd_conn__connect de la bibliothèque mysqlnd.

Comme plugin mysqlnd, l'extension PECL/mysqlnd_uh remplace les fonctions de la bibliothèque C mysqlnd avec ces propres fonctions. A chaque fois qu'une extension PHP MySQL est compilée pour une utilisation de mysqlnd, qu'un appel à une fonction mysqlnd est réalisée, la fonction installée par le plugin est exécutée au lieu de la fonction originale mysqlnd. Si, par exemple, la fonction mysqli_connect() appèle mysqlnd_conn__connect, la fonction de connexion installée par PECL/mysqlnd_uh sera appelée. Les fonctions installées par PECL/mysqlnd_uh sont les méthodes des classes internes.

Les classes internes PHP et leurs méthodes ne font rien, mais un appel à leurs homologues de la bibliothèque C mysqlnd permet d'obtenir un comportement identique à la fonction originale mysqlnd qu'elles remplacent. Le code ci-dessous illustre rapidement ce que la classe fait.

Exemple #1 Ce que fait une classe interne

<?php
class proxy extends MysqlndUhConnection {
 public function connect($res, $host, $user, $passwd, $db, $port, $socket, $mysql_flags) {
   printf("%s(%s)\n", __METHOD__, var_export(func_get_args(), true));
   $ret = parent::connect($res, $host, $user, $passwd, $db, $port, $socket, $mysql_flags);
   printf("%s retourne %s\n", __METHOD__, var_export($ret, true));
   return $ret;
 }
}
mysqlnd_uh_set_connection_proxy(new proxy());

$mysqli = new mysqli("localhost", "root", "", "test");
?>

L'exemple ci-dessus va afficher :

proxy::connect(array (
  0 => NULL,
  1 => 'localhost',
  2 => 'root',
  3 => '',
  4 => 'test',
  5 => 3306,
  6 => NULL,
  7 => 131072,
))
proxy::connect retourne true

LoadingChargement en cours