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
class MysqlndUhConnection { public function connect(($conn, $host, $user, $passwd, $db, $port, $socket, $mysql_flags) { MYSQLND* c_mysqlnd_connection = convert_from_php_to_c($conn); ... return call_c_function(mysqlnd_conn__connect(c_mysqlnd_connection, ...)); } }
Les classes internes fonctionnent comme un proxy transparent. Il vous est possible de remplacer le proxy par le votre, en surchargeant la classe MysqlndUhConnection ou la classe MysqlndUhPreparedStatement pour étendre les fonctionnalités du proxy, suivi de l'enregistrement du nouvel objet proxy. Les objets proxy sont installés en utilisant les fonctions mysqlnd_uh_set_connection_proxy() et mysqlnd_uh_set_statement_proxy().
Exemple #2 Installation d'un proxy
<?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