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.

Questões: um exemplo de encadeamento e cooperação
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()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

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

  2. mysqlnd_cache.query()

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