A API do plugin mysqlnd
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
ouPDO_MYSQL
. Todas as três extensões PHP MySQL usammysqlnd
para estabelecer a conexão com 192.168.2.29. -
Mysqlnd
chama seu método de conexão, que agora é uma sub-classe deext/mysqlnd_plugin
. -
ext/mysqlnd_plugin
chama o gancho do espaço de usuárioproxy::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 aparent::connect(127.0.0.1)
chamando o métodomysqlnd
original para estabelecer uma conexão. -
ext/mysqlnd
estabelece uma conexão e retorna aoext/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.