<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqlnd.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'API интеграции плагинов в драйвер MySQL Native Driver',
    2 => 'API интеграции плагинов в драйвер MySQL Native Driver',
  ),
  'up' => 
  array (
    0 => 'book.mysqlnd.php',
    1 => 'Mysqlnd',
  ),
  'prev' => 
  array (
    0 => 'mysqlnd.memory.php',
    1 => 'Управление памятью',
  ),
  'next' => 
  array (
    0 => 'mysqlnd.plugin.mysql-proxy.php',
    1 => 'Сравнение плагинов mysqlnd с MySQL Proxy',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mysqlnd/plugin.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/mysqlnd.plugin.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqlnd.plugin" class="chapter">
 <h1 class="title">API интеграции плагинов в драйвер MySQL Native Driver</h1>
<h2>Содержание</h2><ul class="chunklist chunklist_chapter"><li><a href="mysqlnd.plugin.mysql-proxy.php">Сравнение плагинов mysqlnd с MySQL Proxy</a></li><li><a href="mysqlnd.plugin.obtaining.php">Получение API плагинов mysqlnd</a></li><li><a href="mysqlnd.plugin.architecture.php">Архитектура плагинов MySQL Native Driver</a></li><li><a href="mysqlnd.plugin.api.php">API плагинов mysqlnd</a></li><li><a href="mysqlnd.plugin.developing.php">Начинаем разработку плагина mysqlnd</a></li></ul>

 <p class="simpara">
  Драйвер MySQL Native Driver, или <code class="literal">mysqlnd</code>, предоставляет API, через который плагины встраиваются
  в драйвер.
  Плагины драйвера <code class="literal">mysqlnd</code>
  работают на уровне между PHP-приложениями и MySQL-сервером, аналогично
  приложению MySQL Proxy, которое также работает между клиентскими приложениями и сервером MySQL.
  Плагины драйвера <code class="literal">mysqlnd</code> выполняют типовые
  задачи MySQL Proxy наподобие балансировки нагрузки, мониторинга и оптимизации
  быстродействия. Из-за другой архитектуры и места обработки запросов
  плагины драйвера <code class="literal">mysqlnd</code> не содержат недочётов MySQL Proxy наподобие
  единой точки отказа, не требуют установки отдельного прокси-сервера
  и изучения нового языка программирования Lua.
 </p>
 <p class="simpara">
  Плагин <code class="literal">mysqlnd</code> расширяет функции драйвера
  <code class="literal">mysqlnd</code>. Плагин умеет перехватывать вызовы функций
  драйвера <code class="literal">mysqlnd</code> из MySQL-модулей PHP наподобие
  <code class="literal">ext/mysql</code>, <code class="literal">ext/mysqli</code> и <code class="literal">PDO_MYSQL</code>.
  Поэтому плагинам драйвера <code class="literal">mysqlnd</code> доступен перехват каждого запроса,
  который модули выполнили из клиентского приложения.
 </p>
 <p class="simpara">
  Плагины умеют перехватывать или подменять вызовы внутренних функций драйвера <code class="literal">mysqlnd</code>.
  API не ограничивает модификацию таблиц внутренних функций драйвера <code class="literal">mysqlnd</code>
  и разрешает перенаправлять вызовы конкретных функций драйвера <code class="literal">mysqlnd</code>
  из <code class="literal">mysqlnd</code>-модулей на функции <code class="literal">mysqlnd</code>-плагина.
  Управление таблицей внутренних функций
  драйвера <code class="literal">mysqlnd</code> даёт плагинам максимум гибкости.
 </p>
 <p class="simpara">
  Плагины драйвера <code class="literal">mysqlnd</code> — фактически PHP-модули на языке C,
  которые работают через API интеграции <code class="literal">mysqlnd</code>-плагинов
  в PHP-драйвер MySQL Native Driver, или <code class="literal">mysqlnd</code>.
  Плагины на 100 % прозрачны
  для PHP-приложений. Приложение не требуется изменять, поскольку плагины работают
  на другом уровне. С точки зрения поведения, <code class="literal">mysqlnd</code>-плагин
  работает на уровень ниже <code class="literal">mysqlnd</code>-драйвера, поскольку переопределяет поведение драйвера.
 </p>
 <p class="simpara">
  Следующий список приводит примеры практических задач,
  которые решают посредством плагинов драйвера <code class="literal">mysqlnd</code>.
 </p>
 <ul class="itemizedlist">
  <li class="listitem">
   <span class="simpara">
    Балансировка нагрузки
   </span>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Разделение чтения и записи. Пример —
      модуль PECL/mysqlnd_ms (Master Slave). Модуль разделяет
      запросы на чтение и запись для настройки репликации.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Отказоустойчивость
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Циклическое распределение запросов по принципу Round-Robin для равномерной нагрузки, распределение на наименее загруженный сервер
     </span>
    </li>
   </ul>
  </li>
  <li class="listitem">
   <span class="simpara">
    Мониторинг
   </span>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Логирование запросов
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Анализ запросов
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Аудит запросов. Пример —
      модуль PECL/mysqlnd_sip (SQL Injection Protection, защита
      от SQL-инъекций). Модуль инспектирует запросы
      и выполняет только те, которые соответствуют набору правил.
     </span>
    </li>
   </ul>
  </li>
  <li class="listitem">
   <span class="simpara">
    Производительность.
   </span>
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Кеширование. Пример —
      модуль PECL/mysqlnd_qc (Query Cache, кеширование запросов).
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Ограничение числа запросов
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Шардирование. Пример — модуль PECL/mysqlnd_mc
      (Multi Connect). Модуль пытается разбить запрос
      SELECT на n частей через SELECT ... LIMIT part_1,
      SELECT LIMIT part_n. Модуль отправляет запросы
      на отдельные MySQL-серверы и объединяет результаты на клиенте.
     </span>
    </li>
   </ul>
  </li>
 </ul>
 <p class="simpara">
  <strong>Доступные плагины драйвера MySQL Native Driver</strong>
 </p>
 <p class="simpara">
  Репозитории PECL уже содержит ряд mysqlnd-плагинов, включая следующие:
 </p>
 <ul class="itemizedlist">
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_mc</strong> — Multi
    Connect, разбивка запросов по шардам.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_ms</strong> — Master
    Slave, разделение запросов на чтение и запросов на запись.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_qc</strong> — Query
    Cache, кеширование результатов запросов.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_pscache</strong> —
    Prepared Statement Handle Cache, обработка
    кеширования подготовленных запросов.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_sip</strong> — SQL
    Injection Protection, защита от SQL-инъекций.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>mysqlnd_uh</strong> — User
    Handler, обработка пользователей.
   </span>
  </li>
 </ul>
 
 
 
 
 
</div>
<?php manual_footer($setup); ?>