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