CakeFest 2024: The Official CakePHP Conference

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()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

ext/mysqlnd_monitor mysqlnd_monitor.query()
  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. 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.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top