## La API de complementos de mysqlnd

La siguiente es una lista de funciones proporcionadas en la API de complementos de `mysqlnd`:

- mysqlnd_plugin_register()

- mysqlnd_plugin_count()

- mysqlnd_plugin_get_plugin_connection_data()

- mysqlnd_plugin_get_plugin_result_data()

- mysqlnd_plugin_get_plugin_stmt_data()

- mysqlnd_plugin_get_plugin_net_data()

- mysqlnd_plugin_get_plugin_protocol_data()

- mysqlnd_conn_get_methods()

- mysqlnd_result_get_methods()

- mysqlnd_result_meta_get_methods()

- mysqlnd_stmt_get_methods()

- mysqlnd_net_get_methods()

- mysqlnd_protocol_get_methods()

No existe una definción formal de lo que es un complemento y cómo funciona el mecanismo de un complemento.

Los componentes que se encuentran a menudo en los mecanismos de los complementos son:

- Un gestor de complemento

- Una API de complemento

- Servicios de aplicación (o módulos)

- APIs de servicios de aplicación (o APIs de módulos)

El concepto de complemento de `mysqlnd` emplea estas características, y además disgruta de una arquitectura abierta.

Sin restricciones

Un complemento tiene acceso completo al funcionamiento interno de `mysqlnd`. No existen límites de seguridad o restricciones. Todo puede ser sobrescrito para implementar algoritmos amistosos u hostiles. Se recomienda que se desplieguen complementos desde una fuente de confianza.

Como se discutió anteriormente, los complementos puede usar punteros libremente. Estos punteros no están restringidos de ninguna manera, y pueden apuntar a los datos de otros complementos. Se puede usar una sencilla aritmética de índices para leer los datos de otros complementos.

Se recomienda que se escriban complementos cooperativos, y que siempre se llame al método padre. Los complemento deberían siempre cooperar con `mysqlnd`.

Cuestiones: un ejemplo de encadenamiento y cooperación
Extensión | puntero de mysqlnd.query() | pila de llamdas si se llama al padre
ext/mysqlnd | mysqlnd.query() | mysqlnd.query
ext/mysqlnd_cache | mysqlnd_cache.query() | mysqlnd_cache.query() mysqlnd.query
ext/mysqlnd_monitor | mysqlnd_monitor.query() | mysqlnd_monitor.query() mysqlnd_cache.query() mysqlnd.query

En este escenario, se cargan una caché (`ext/mysqlnd_cache`) y un complemento monitor (`ext/mysqlnd_monitor`). Ambos subclases de `Connection::query()`. El registro del complemento sucede en `MINIT` usando la lógica mostrada anteriormente. PHP llama a las extensiones en orden alfabético de manera predeterminada. Los complementos no son conscientes de los demás complementos y no establecen dependencias de extensiones.

Por omisión, los complementos llaman a la implementación padre del método de consulta en sus versiones derivadas del método.

Resumen de las extensiones de PHP

Este es un resumen de lo que sucede cuando se usa un complemento de ejemplo, `ext/mysqlnd_plugin`, el cual expone la API de complementos en C de `mysqlnd` a PHP:

- Cualquier apliacación de MySQL de PHP intenta establecer una conexión con 192.168.2.29

- La aplicación de PHP usará `ext/mysql`, `ext/mysqli` o `PDO_MYSQL`. Estas tres extensiones de MySQL de PHP utilizan `mysqlnd` para establecer la conexión con 192.168.2.29.

- `Mysqlnd` llama a sus método de conexión, los cuales han sido derivados por `ext/mysqlnd_plugin`.

- `ext/mysqlnd_plugin` llama al gancho del espacio de usuario `proxy::connect()` registrado por el usuario.

- El gancho del espacio de usuario cambia la IP de conexión del anfitrión de 192.168.2.29 a 127.0.0.1 y devuelve la conexión establecida por `parent::connect()`.

- `ext/mysqlnd_plugin` realiza el equivalente de `parent::connect(127.0.0.1)` llamando al método original de `mysqlnd` para establecer una conexión.

- `ext/mysqlnd` establece una conexión y devuelve a `ext/mysqlnd_plugin`. `ext/mysqlnd_plugin` devuelve también.

- Cualquiera que sea la extensión de MySQL de PHP que haya sido usada por la aplicación, ésta recibe una conexión a 127.0.0.1. La extensión de MySQL de PHP en sí devuelve a la aplicación de PHP. El círculo se cierra.