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