<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.api.php',
    1 => 'L\'API du plugin mysqlnd',
    2 => 'L\'API du plugin mysqlnd',
  ),
  'up' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'API du plugin du driver natif MySQL',
  ),
  'prev' => 
  array (
    0 => 'mysqlnd.plugin.architecture.php',
    1 => 'Architecture du plugin du driver natif',
  ),
  'next' => 
  array (
    0 => 'mysqlnd.plugin.developing.php',
    1 => 'Bien commencer la compilation d\'un plugin mysqlnd',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">L&#039;API du plugin mysqlnd</h2>
  <p class="simpara">
   Voici la liste des fonctions fournies dans l&#039;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">
   Il n&#039;y a pas de définition formelle de ce qu&#039;est un plugin
   ainsi de la façon dont fonctionne un plugin.
  </p>
  <p class="simpara">
   Les composants les plus souvent trouvés dans les mécanismes de plugin sont :
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Un gestionnaire de plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Une API du plugin
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Les services applicatifs (ou modules)
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Les APIs des services applicatifs (ou APIs du module)
    </span>
   </li>
  </ul>
  <p class="simpara">
   Le concept d&#039;un plugin <code class="literal">mysqlnd</code> utilise ces fonctionnalités,
   ainsi que d&#039;autres joyeusetés d&#039;architecture ouverte.
  </p>
  <p class="simpara">
   <strong>Aucune restriction</strong>
  </p>
  <p class="simpara">
   Un plugin a un accès total aux travaux internes de
   <code class="literal">mysqlnd</code>. Il n&#039;y a aucune limite de sécurité
   ou de restrictions. Tout peut être écrasé pour implémenter des
   algorithmes utiles ou hostiles. Il est recommandé de ne déployer
   que des plugins depuis des sources de confiance.
  </p>
  <p class="simpara">
   Tel que discuté précédemment, les plugins peuvent utiliser librement
   des pointeurs. Ces pointeurs ne sont restreints en aucune manière,
   aussi, il est possible de pointer vers les données d&#039;un autre plugin.
   Une simple position arithmétique peut être utilisée pour lire
   les données d&#039;un autre plugin.
  </p>
  <p class="simpara">
   Il est recommandé d&#039;écrire des plugins coopératifs, et ainsi, appeler
   toujours la méthode parent. Les plugins devraient toujours coopérer avec
   <code class="literal">mysqlnd</code>.
  </p>
  <table id="mysqlnd.plugin.chaining" class="doctable table">
   <caption><strong>Enjeux : un exemple de chaînage et de coopération</strong></caption>
   
    <thead>
     <tr>
      <th>Extension</th>
      <th>Pointeur mysqlnd.query()</th>
      <th>Pile d&#039;appel si on appelle le parent</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">
   Dans ce scénario, un plugin cache (<code class="literal">ext/mysqlnd_cache</code>) et
   un plugin de surveillance (<code class="literal">ext/mysqlnd_monitor</code>)
   sont chargés. Les 2 ont une sous-classe de <code class="literal">Connection::query()</code>.
   L&#039;enregistrement du plugin survient lors du <code class="literal">MINIT</code>
   en utilisant la logique évoquée précédemment. PHP appelle les extensions
   dans un ordre alphabétique par défaut. Les plugins ne sont pas au courant
   les uns les autres et ne peuvent fixer de dépendances.
  </p>
  <p class="simpara">
   Par défaut, les plugins appellent l&#039;implémentation du parent de la
   méthode de requête dans leur version de la méthode dérivée.
  </p>
  <p class="simpara">
   <strong>Récapitulatif de l&#039;extension PHP</strong>
  </p>
  <p class="simpara">
   Voici un récapitulatif de ce qui survient lors de l&#039;utilisation
   d&#039;un plugin d&#039;exemple, <code class="literal">ext/mysqlnd_plugin</code>,
   qui expose l&#039;API C du plugin <code class="literal">mysqlnd</code> à PHP :
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Toutes les applications PHP MySQL tentent d&#039;établir une connexion
     à l&#039;adresse 192.168.2.29
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     L&#039;application PHP utilisera <code class="literal">ext/mysql</code>,
     <code class="literal">ext/mysqli</code> ou <code class="literal">PDO_MYSQL</code>.
     Ces 3 extensions PHP MySQL utilisent <code class="literal">mysqlnd</code> pour
     établir la connexion à l&#039;adresse 192.168.2.29.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">Mysqlnd</code> appelle sa méthode de connexion, qui a été sous-classée
     par <code class="literal">ext/mysqlnd_plugin</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> appelle la méthode de l&#039;espace utilisateur
     <code class="literal">proxy::connect()</code> enregistrée par l&#039;utilisateur.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     L&#039;espace utilisateur modifie l&#039;hôte de connexion de 192.168.2.29
     à 127.0.0.1 et retourne la connexion établie par
     <code class="literal">parent::connect()</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd_plugin</code> exécute l&#039;équivalent de
     <code class="literal">parent::connect(127.0.0.1)</code> en appelant la méthode
     originale de <code class="literal">mysqlnd</code> pour établir une connexion.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="literal">ext/mysqlnd</code> établit une connexion et redonne la main
     à <code class="literal">ext/mysqlnd_plugin</code>.
     <code class="literal">ext/mysqlnd_plugin</code> retourne également.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Quelle que soit l&#039;extension PHP MySQL utilisée par l&#039;application,
     elle reçoit une connexion à 127.0.0.1. L&#039;extension PHP MySQL
     redonne la main à l&#039;application PHP. Le cycle est clos.
    </span>
   </li>
  </ul>
 </div><?php manual_footer($setup); ?>