This describes the background and inner workings of the mysqlnd_uh extension.
   Two classes are provided by the extension: MysqlndUhConnection
   and MysqlndUhPreparedStatement. MysqlndUhConnection lets
   you access almost all methods of the mysqlnd
   internal connection class. The latter exposes some selected
   methods of the  mysqlnd internal statement class.
   For example, MysqlndUhConnection::connect() maps to
   the mysqlnd library C function
   mysqlnd_conn__connect.
  
   As a mysqlnd plugin, the PECL/mysqlnd_uh extension replaces mysqlnd
   library C functions with its own functions. Whenever a
   PHP MySQL extension compiled to use mysqlnd calls
   a mysqlnd function, the functions installed by the plugin are executed
   instead of the original mysqlnd ones. For example,
   mysqli_connect() invokes mysqlnd_conn__connect,
   so the connect function installed by PECL/mysqlnd_uh will be called.
   The functions installed by PECL/mysqlnd_uh are the methods of the built-in classes.
  
   The built-in PHP classes and their methods do nothing but call their
   mysqlnd C library counterparts, to behave exactly
   like the original mysqlnd function they replace.
   The code below illustrates in pseudo-code what the extension does.
  
Example #1 Pseudo-code: what a built-in class does
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, ...));
  }
}
The build-in classes behave like a transparent proxy. It is possible for you to replace the proxy with your own. This is done by subclassing MysqlndUhConnection or MysqlndUhPreparedStatement to extend the functionality of the proxy, followed by registering a new proxy object. Proxy objects are installed by mysqlnd_uh_set_connection_proxy() and mysqlnd_uh_set_statement_proxy().
Example #2 Installing a 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 returns %s\n", __METHOD__, var_export($ret, true));
   return $ret;
 }
}
mysqlnd_uh_set_connection_proxy(new proxy());
$mysqli = new mysqli("localhost", "root", "", "test");
?>
以上例程会输出:
proxy::connect(array ( 0 => NULL, 1 => 'localhost', 2 => 'root', 3 => '', 4 => 'test', 5 => 3306, 6 => NULL, 7 => 131072, )) proxy::connect returns true