A seguir está uma lista de funções fornecidas na API
do 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()
Não existe uma definição formal do que é um plugin e como funciona um mecanismo de plugin.
Os componentes frequentemente encontrados em mecanismos de plugins são:
Um gerenciador de plugin
Uma API de plugin
Serviços (ou módulos) de aplicação
APIs de serviço (ou APIs de módulo) de aplicação
O conceito do plugin mysqlnd emprega esses recursos e,
adicionalmente, desfruta de uma arquitetura aberta.
Sem Restrições
Um plugin tem acesso total ao funcionamento interno do
mysqlnd. Não há limites ou restrições de
segurança. Tudo pode ser sobrescrito para implementar algoritmos amigáveis ou
hostis. É recomendado que se implante apenas plugins de uma
fonte confiável.
Conforme discutido anteriormente, os plugins podem usar ponteiros livremente. Esses ponteiros não são restritos de forma alguma e podem apontar para dados de outro plugin. A aritmética de deslocamento simples pode ser usada para ler os dados de outro plugin.
É recomendado que se escreva plugins cooperativos e que sempre se
chame o método pai. Os plugins devem sempre cooperar
com o próprio mysqlnd.
| Extensão | Ponteiro mysqlnd.query() | pilha de chamadas se estiver chamando o pai |
|---|---|---|
| ext/mysqlnd | mysqlnd.query() | mysqlnd.query |
| ext/mysqlnd_cache | mysqlnd_cache.query() |
|
| ext/mysqlnd_monitor | mysqlnd_monitor.query() |
|
Neste cenário, um cache (ext/mysqlnd_cache) e
um plugin de monitor (ext/mysqlnd_monitor) são carregados.
Ambas são sub-classes de Connection::query(). O registro
do plugin acontece em MINIT usando a lógica
mostrada anteriormente. O PHP chama extensões em ordem alfabética por
padrão. Os plugins não reconhecem uns aos outros e não definem dependências
de extensão.
Por padrão, os plugins chamam a implementação pai do método de consulta em sua versão derivada do método.
Recapitulação da Extensão PHP
Esta é uma recapitulação do que acontece ao usar um plugin de exemplo,
ext/mysqlnd_plugin, que expõe a API do
plugin C mysqlnd ao PHP:
Qualquer aplicação PHP MySQL tenta estabelecer uma conexão com 192.168.2.29
A aplicação PHP usará ext/mysql,
ext/mysqli ou PDO_MYSQL. Todas
as três extensões PHP MySQL usam mysqlnd para
estabelecer a conexão com 192.168.2.29.
Mysqlnd chama seu método de conexão, que agora é
uma sub-classe de ext/mysqlnd_plugin.
ext/mysqlnd_plugin chama o gancho do espaço de usuário
proxy::connect() registrado pelo usuário.
O gancho do espaço de usuário altera o IP do host de conexão de 192.168.2.29
para 127.0.0.1 e retorna a conexão estabelecida por
parent::connect().
ext/mysqlnd_plugin executa o equivalente a
parent::connect(127.0.0.1) chamando o
método mysqlnd original para estabelecer uma
conexão.
ext/mysqlnd estabelece uma conexão e retorna
ao ext/mysqlnd_plugin.
ext/mysqlnd_plugin também retorna.
Qualquer que seja a extensão PHP MySQL utilizada pela aplicação, ela recebe uma conexão com 127.0.0.1. A própria extensão PHP MySQL retorna ao aplicativo PHP. E o ciclo se fecha.