## La API del plugin mysqlnd

A continuación se presenta la lista de funciones proporcionadas en la API plugin `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 hay una definición formal de qué es un plugin ni de cómo funciona un plugin.

Los componentes más frecuentemente encontrados en los mecanismos de plugin son:

- Un gestor de plugin
- Una API del plugin
- Los servicios aplicativos (o módulos)
- Las APIs de los servicios aplicativos (o APIs del módulo)

El concepto de un plugin `mysqlnd` utiliza estas características, así como otras joyas de arquitectura abierta.

Sin restricciones

Un plugin tiene acceso total a los trabajos internos de `mysqlnd`. No hay límites de seguridad ni restricciones. Todo puede ser sobrescrito para implementar algoritmos útiles o hostiles. Se recomienda desplegar solo plugins desde fuentes de confianza.

Tal como se ha discutido anteriormente, los plugins pueden utilizar libremente punteros. Estos punteros no están restringidos de ninguna manera, por lo que puede apuntar hacia los datos de otro plugin. Una simple posición aritmética puede ser utilizada para leer los datos de otro plugin.

Se recomienda escribir plugins cooperativos, y por lo tanto, siempre llamar al método padre. Los plugins deben cooperar siempre con `mysqlnd`.

Problemas: un ejemplo de encadenamiento y cooperación
Extensión | Puntero mysqlnd.query() | Pila de llamadas 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, un plugin de caché (`ext/mysqlnd_cache`) y un plugin de supervisión (`ext/mysqlnd_monitor`) están cargados. Ambos tienen una subclase de `Connection::query()`. El registro del plugin ocurre durante el `MINIT` utilizando la lógica mencionada anteriormente. PHP llama a las extensiones en un orden alfabético por defecto. Los plugins no están al tanto unos de otros y no pueden fijar dependencias.

Por defecto, los plugins llaman a la implementación del padre de la función de consulta en su versión de la función derivada.

Resumen de la extensión PHP

A continuación se presenta un resumen de lo que ocurre al utilizar un plugin de ejemplo, `ext/mysqlnd_plugin`, que expone la API C del plugin `mysqlnd` a PHP:

- Todas las aplicaciones PHP MySQL intentan establecer una conexión a la dirección 192.168.2.29
- La aplicación PHP utilizará `ext/mysql`, `ext/mysqli` o `PDO_MYSQL`. Estas 3 extensiones PHP MySQL utilizan `mysqlnd` para establecer la conexión a la dirección 192.168.2.29.
- `Mysqlnd` llama a su método de conexión, que ha sido subclaseado por `ext/mysqlnd_plugin`.
- `ext/mysqlnd_plugin` llama al método del espacio de usuario `proxy::connect()` registrado por el usuario.
- El espacio de usuario modifica el host de conexión de 192.168.2.29 a 127.0.0.1 y devuelve la conexión establecida por `parent::connect()`.
- `ext/mysqlnd_plugin` ejecuta 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 el control a `ext/mysqlnd_plugin`. `ext/mysqlnd_plugin` también devuelve.
- Cualquier extensión PHP MySQL utilizada por la aplicación, recibe una conexión a 127.0.0.1. La extensión PHP MySQL devuelve el control a la aplicación PHP. El ciclo está cerrado.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open