mysqlnd-uh-php-quickstart-php-how-it-works-2

  • Quickstart and
    Examples
  • How it works

  • How it works
  • How it works

    How it works

    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($rettrue));
       return 
    $ret;
     }
    }
    mysqlnd_uh_set_connection_proxy(new proxy());

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

    The above example will output:

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