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
.
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() |
|
ext/mysqlnd_monitor | mysqlnd_monitor.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.