<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.api.php',
    1 => 'La API del plugin mysqlnd',
    2 => 'La API del plugin mysqlnd',
  ),
  'up' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'API del plugin del controlador nativo MySQL',
  ),
  'prev' => 
  array (
    0 => 'mysqlnd.plugin.architecture.php',
    1 => 'Arquitectura del plugin del controlador nativo',
  ),
  'next' => 
  array (
    0 => 'mysqlnd.plugin.developing.php',
    1 => 'C&oacute;mo comenzar a compilar un plugin mysqlnd',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">La API del plugin mysqlnd</h2>
  <p class="simpara">
   A continuación se presenta la lista de funciones proporcionadas en la API 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">
   No hay una definición formal de qué es un plugin
   ni de cómo funciona un plugin.
  </p>
  <p class="simpara">
   Los componentes más frecuentemente encontrados en los mecanismos de plugin son:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Un gestor de plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Una API del plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Los servicios aplicativos (o módulos)
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Las APIs de los servicios aplicativos (o APIs del módulo)
    </span>
   </li>
  </ul>
  <p class="simpara">
   El concepto de un plugin <code class="literal">mysqlnd</code> utiliza estas características,
   así como otras joyas de arquitectura abierta.
  </p>
  <p class="simpara">
   <strong>Sin restricciones</strong>
  </p>
  <p class="simpara">
   Un plugin tiene acceso total a los trabajos internos de
   <code class="literal">mysqlnd</code>. 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.
  </p>
  <p class="simpara">
   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.
  </p>
  <p class="simpara">
   Se recomienda escribir plugins cooperativos, y por lo tanto, siempre llamar
   al método padre. Los plugins deben cooperar siempre con
   <code class="literal">mysqlnd</code>.
  </p>
  <table id="mysqlnd.plugin.chaining" class="doctable table">
   <caption><strong>Problemas: un ejemplo de encadenamiento y cooperación</strong></caption>
   
    <thead>
     <tr>
      <th>Extensión</th>
      <th>Puntero mysqlnd.query()</th>
      <th>Pila de llamadas si se llama al padre</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">
   En este escenario, un plugin de caché (<code class="literal">ext/mysqlnd_cache</code>) y
   un plugin de supervisión (<code class="literal">ext/mysqlnd_monitor</code>)
   están cargados. Ambos tienen una subclase de <code class="literal">Connection::query()</code>.
   El registro del plugin ocurre durante el <code class="literal">MINIT</code>
   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.
  </p>
  <p class="simpara">
   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.
  </p>
  <p class="simpara">
   <strong>Resumen de la extensión PHP</strong>
  </p>
  <p class="simpara">
   A continuación se presenta un resumen de lo que ocurre al utilizar
   un plugin de ejemplo, <code class="literal">ext/mysqlnd_plugin</code>,
   que expone la API C del plugin <code class="literal">mysqlnd</code> a PHP:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Todas las aplicaciones PHP MySQL intentan establecer una conexión
     a la dirección 192.168.2.29
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     La aplicación PHP utilizará <code class="literal">ext/mysql</code>,
     <code class="literal">ext/mysqli</code> o <code class="literal">PDO_MYSQL</code>.
     Estas 3 extensiones PHP MySQL utilizan <code class="literal">mysqlnd</code> para
     establecer la conexión a la dirección 192.168.2.29.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">Mysqlnd</code> llama a su método de conexión, que ha sido subclaseado
     por <code class="literal">ext/mysqlnd_plugin</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> llama al método del espacio de usuario
     <code class="literal">proxy::connect()</code> registrado por el usuario.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     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
     <code class="literal">parent::connect()</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> ejecuta el equivalente de
     <code class="literal">parent::connect(127.0.0.1)</code> llamando al método
     original de <code class="literal">mysqlnd</code> para establecer una conexión.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd</code> establece una conexión y devuelve el control
     a <code class="literal">ext/mysqlnd_plugin</code>.
     <code class="literal">ext/mysqlnd_plugin</code> también devuelve.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     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.
    </span>
   </li>
  </ul>
 </div><?php manual_footer($setup); ?>