<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mysqlnd.plugin.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.api.php',
    1 => 'A API do plugin mysqlnd',
    2 => 'A API do plugin mysqlnd',
  ),
  'up' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'API do plugin do Driver Nativo MySQL',
  ),
  'prev' => 
  array (
    0 => 'mysqlnd.plugin.architecture.php',
    1 => 'Arquitetura do Plugin do Driver Nativo MySQL',
  ),
  'next' => 
  array (
    0 => 'mysqlnd.plugin.developing.php',
    1 => 'Come&ccedil;ando a construir um plugin mysqlnd',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/mysqlnd/plugin.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqlnd.plugin.api" class="section">
  <h2 class="title">A API do plugin mysqlnd</h2>
  <p class="simpara">
   A seguir está uma lista de funções fornecidas na API
   do plugin <code class="literal">mysqlnd</code>:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_register()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_count()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_get_plugin_connection_data()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_get_plugin_result_data()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_get_plugin_stmt_data()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_get_plugin_net_data()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_plugin_get_plugin_protocol_data()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_conn_get_methods()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_result_get_methods()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_result_meta_get_methods()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_stmt_get_methods()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_net_get_methods()
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     mysqlnd_protocol_get_methods()
    </span>
   </li>
  </ul>
  <p class="simpara">
   Não existe uma definição formal do que é um plugin e como funciona
   um mecanismo de plugin.
  </p>
  <p class="simpara">
   Os componentes frequentemente encontrados em mecanismos de plugins são:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Um gerenciador de plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Uma API de plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Serviços (ou módulos) de aplicação
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     APIs de serviço (ou APIs de módulo) de aplicação
    </span>
   </li>
  </ul>
  <p class="simpara">
   O conceito do plugin <code class="literal">mysqlnd</code> emprega esses recursos e,
   adicionalmente, desfruta de uma arquitetura aberta.
  </p>
  <p class="simpara">
   <strong>Sem Restrições</strong>
  </p>
  <p class="simpara">
   Um plugin tem acesso total ao funcionamento interno do
   <code class="literal">mysqlnd</code>. 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.
  </p>
  <p class="simpara">
   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.
  </p>
  <p class="simpara">
   É recomendado que se escreva plugins cooperativos e que sempre se
   chame o método pai. Os plugins devem sempre cooperar
   com o próprio <code class="literal">mysqlnd</code>.
  </p>
  <table id="mysqlnd.plugin.chaining" class="doctable table">
   <caption><strong>Questões: um exemplo de encadeamento e cooperação</strong></caption>
   
    <thead>
     <tr>
      <th>Extensão</th>
      <th>Ponteiro mysqlnd.query()</th>
      <th>pilha de chamadas se estiver chamando o pai</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>ext/mysqlnd</td>
      <td>mysqlnd.query()</td>
      <td>mysqlnd.query</td>
     </tr>

     <tr>
      <td>ext/mysqlnd_cache</td>
      <td>mysqlnd_cache.query()</td>
      <td><ol type="1">
        <li class="listitem">
         <span class="simpara">
          mysqlnd_cache.query()
         </span>
        </li>
        <li class="listitem">
         <span class="simpara">
          mysqlnd.query
         </span>
        </li>
       </ol></td>
     </tr>

     <tr>
      <td>ext/mysqlnd_monitor</td>
      <td>mysqlnd_monitor.query()</td>
      <td><ol type="1">
        <li class="listitem">
         <span class="simpara">
          mysqlnd_monitor.query()
         </span>
        </li>
        <li class="listitem">
         <span class="simpara">
          mysqlnd_cache.query()
         </span>
        </li>
        <li class="listitem">
         <span class="simpara">
          mysqlnd.query
         </span>
        </li>
       </ol></td>
     </tr>

    </tbody>
   
  </table>

  <p class="simpara">
   Neste cenário, um cache (<code class="literal">ext/mysqlnd_cache</code>) e
   um plugin de monitor (<code class="literal">ext/mysqlnd_monitor</code>) são carregados.
   Ambas são sub-classes de <code class="literal">Connection::query()</code>. O registro
   do plugin acontece em <code class="literal">MINIT</code> 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.
  </p>
  <p class="simpara">
   Por padrão, os plugins chamam a implementação pai do método de
   consulta em sua versão derivada do método.
  </p>
  <p class="simpara">
   <strong>Recapitulação da Extensão PHP</strong>
  </p>
  <p class="simpara">
   Esta é uma recapitulação do que acontece ao usar um plugin de exemplo,
   <code class="literal">ext/mysqlnd_plugin</code>, que expõe a API do
   plugin C <code class="literal">mysqlnd</code> ao PHP:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Qualquer aplicação PHP MySQL tenta estabelecer uma conexão com
     192.168.2.29
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     A aplicação PHP usará <code class="literal">ext/mysql</code>,
     <code class="literal">ext/mysqli</code> ou <code class="literal">PDO_MYSQL</code>. Todas
     as três extensões PHP MySQL usam <code class="literal">mysqlnd</code> para
     estabelecer a conexão com 192.168.2.29.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">Mysqlnd</code> chama seu método de conexão, que agora é
     uma sub-classe de <code class="literal">ext/mysqlnd_plugin</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> chama o gancho do espaço de usuário
     <code class="literal">proxy::connect()</code> registrado pelo usuário.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     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
     <code class="literal">parent::connect()</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> executa o equivalente a
     <code class="literal">parent::connect(127.0.0.1)</code> chamando o
     método <code class="literal">mysqlnd</code> original para estabelecer uma
     conexão.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd</code> estabelece uma conexão e retorna
     ao <code class="literal">ext/mysqlnd_plugin</code>.
     <code class="literal">ext/mysqlnd_plugin</code> também retorna.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     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.
    </span>
   </li>
  </ul>
 </div><?php manual_footer($setup); ?>