<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'MySQL Native Driver プラグインAPI',
    2 => 'MySQL Native Driver プラグインAPI',
  ),
  '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' => 'ja',
    '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">MySQL Native Driver プラグインAPI</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">mysqlnd plugin APIを取得する</a></li><li><a href="mysqlnd.plugin.architecture.php">MySQL Native Driverプラグイン のアーキテクチャ</a></li><li><a href="mysqlnd.plugin.api.php">mysqlnd のプラグインAPI</a></li><li><a href="mysqlnd.plugin.developing.php">mysqlndプラグインの開発をはじめよう</a></li></ul>

 <p class="simpara">
  The MySQL Native Driver プラグインAPI は MySQL Native Driver、略して <code class="literal">mysqlnd</code> が持つ機能の一つです。<code class="literal">mysqlnd</code> プラグインは、PHPアプリケーションと MySQL サーバーの間にあるレイヤで動きます。これは MySQL Proxy と比較できます。MySQL Proxy はあらゆる MySQL クライアントアプリケーション、たとえば PHPアプリケーション と 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> 関数の制御を奪い取ることができます。<code class="literal">mysqlnd</code> 関数は <code class="literal">ext/mysql</code> や <code class="literal">ext/mysqli</code>、<code class="literal">PDO_MYSQL</code> のような PHP の MySQL拡張モジュールによって呼び出されます。その結果として、<code class="literal">mysqlnd</code>プラグイン はクライアントアプリケーションからこれらの拡張モジュールへの呼び出しの制御をすべて奪うことができるのです。
 </p>
 <p class="simpara">
  内部的な <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>プラグインの適切な関数に処理を転送するようにセットアップすることが可能です。このように、<code class="literal">mysqlnd</code> の内部関数テーブルを管理できることで、プラグインの柔軟性が最大限に発揮できるのです。
 </p>
 <p class="simpara">
  <code class="literal">mysqlnd</code>プラグインは、実際は <code class="literal">mysqlnd</code> のプラグインAPI (これは MySQL Native Driver, 略して <code class="literal">mysqlnd</code> に組み込まれています) を使い、C言語 で書かれた PHP拡張モジュール です。 プラグインは PHPアプリケーションに対して 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">
      ラウンドロビン, 負荷が一番低いサーバーへの転送
     </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) が挙げられます。この 拡張モジュール はクエリを調べ、ルールセットに従って許可されたクエリのみを実行します。
     </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 ステートメントを SELECT ... LIMIT part1, SELECT LIMIT part_n という形でn個に分割します。そしてクエリを別々の MySQLサーバーに送り、結果をクライアント側でマージします。
     </span>
    </li>
   </ul>
  </li>
 </ul>
 <p class="simpara">
  <strong>利用可能な MySQL Native Driverプラグイン</strong>
 </p>
 <p class="simpara">
  既にたくさんの mysqlnd プラグインが利用可能になっています。以下が含まれます。
 </p>
 <ul class="itemizedlist">
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_mc</strong> - 複数接続ができるプラグイン
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_ms</strong> - マスタースレーブ構成用のプラグイン
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_qc</strong> - クエリキャッシュプラグイン
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_pscache</strong> - プリペアドステートメントハンドルをキャッシュするプラグイン
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_sip</strong> - SQLインジェクションから防御するためのプラグイン
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    <strong>PECL/mysqlnd_uh</strong> - ユーザーハンドラープラグイン
   </span>
  </li>
 </ul>
 
 
 
 
 
</div>
<?php manual_footer($setup); ?>