<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'mysqlnd.plugin.mysql-proxy.php',
    1 => 'mysqlndプラグイン と MySQL Proxyの比較',
    2 => 'mysqlndプラグイン と MySQL Proxyの比較',
  ),
  'up' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'MySQL Native Driver プラグインAPI',
  ),
  'prev' => 
  array (
    0 => 'mysqlnd.plugin.php',
    1 => 'MySQL Native Driver プラグインAPI',
  ),
  'next' => 
  array (
    0 => 'mysqlnd.plugin.obtaining.php',
    1 => 'mysqlnd plugin APIを取得する',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    '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.mysql-proxy" class="section">
  <h2 class="title">mysqlndプラグイン と MySQL Proxyの比較</h2>
  <p class="simpara">
   <code class="literal">mysqlnd</code>プラグインと MySQL Proxyは、異なるアプローチを用いた異なる技術です。どちらもロードバランシングや監視、パフォーマンスの向上のような共通の様々な課題を解決するのに適したツールです。重要な違いは、MySQL Proxyがあらゆる MySQLクライアント と協調して動作するのに対して、<code class="literal">mysqlnd</code>プラグインは PHPアプリケーション との協調動作に特化しているということです。
  </p>
  <p class="simpara">
   PHP拡張モジュールとして、<code class="literal">mysqlnd</code>プラグイン はPHPの残りの部分とともに、PHPのアプリケーションサーバーにインストールされます。MySQL Proxy はPHPアプリケーションサーバー上でも動作しますし、複数のPHPアプリケーションサーバーを扱う専用マシンにもインストールできます。
  </p>
  <p class="simpara">
   MySQL Proxyをアプリケーションサーバーにデプロイすることにはふたつの利点があります:
  </p>
  <ol type="1">
   <li class="listitem">
    <span class="simpara">
     単一障害点がありません
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     スケールアウトしやすい (水平方向へのスケールアウト、クライアントによるスケーリング)
    </span>
   </li>
  </ol>
  <p class="simpara">
   MySQL Proxy (と、<code class="literal">mysqlnd</code>プラグイン) は、他のやり方だと既存のアプリケーションを変更しなければならない問題にも容易に対処することができます。
  </p>
  <p class="simpara">
   しかし、MySQL Proxyにはいくつか欠点があります:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     MySQL Proxy のコンポーネントと技術について新たにマスターし、デプロイしなければなりません。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     MySQL Proxy は Lua スクリプト言語の知識が必要です。
    </span>
   </li>
  </ul>
  <p class="simpara">
   MySQL Proxy は C言語と プログラミング言語 Lua によってカスタマイズできます。Lua は MySQL Proxy において好ましいスクリプト言語です。ほとんどのPHPエキスパートにとって、Lua は新しく学ばなければならない言語です。<code class="literal">mysqlnd</code>プラグインは C言語で書くことができます。<a href="https://pecl.php.net/package/mysqlnd_uh" class="link external">&raquo;&nbsp;PECL/mysqlnd_uh</a> を使って、プラグインを PHP で書くこともできます。
  </p>
  <p class="simpara">
   MySQL Proxy はデーモン - バックグラウンドのプロセスとして動作します。MySQL Proxy は初期の決定を取り消すこともできますが、すべての状態を保持することできます。しかしながら <code class="literal">mysqlnd</code>プラグインは、PHPのリクエスト単位のライフサイクルに結びついています。MySQL Proxy は一度計算された結果を複数のアプリケーションサーバーで共有できます。<code class="literal">mysqlnd</code>プラグインでこれを行うには、永続的なストレージにデータを保存する必要があります。この目的のためには Memcache のような別のデーモンが必要です。この場合は、MySQL Proxy に有利です。
  </p>
  <p class="simpara">
   MySQL Proxy は wire protocol (訳注：ネットワークを通じてデータを転送するプロトコル。<a href="http://en.wikipedia.org/wiki/Wire_protocol" class="link external">&raquo;&nbsp;WikipediaでのWire Protocolの説明</a>, <a href="http://stackoverflow.com/questions/2324089/can-someone-explain-what-a-wire-level-protocol-is" class="link external">&raquo;&nbsp;StackOverflow でのWire Protocolの説明</a>) の上で動作します。MySQL Proxy を使うと、MySQLクライアントサーバープロトコルを解析し、リバースエンジニアリングしなければなりません。MySQL Proxy でできることは、通信プロトコルを管理することで達成できることに限られます。wire protocol が変更(滅多にありませんが)されると、MySQL Proxy のスクリプトも変更する必要があります。
  </p>
  <p class="simpara">
   <code class="literal">mysqlnd</code>プラグインは C言語のAPI上で動作します。このAPIは <code class="literal">libmysqlclient</code>クライアント の動きをそのままコピーしています。この C言語のAPI は、 基本的に MySQLクライアントサーバープロトコル、時に wire protocol と呼ばれるもののラッパーです。開発者は C言語のAPI呼び出しの制御を奪うことができます。それゆえに、wire protocol レベルのプログラムに一切変更を加えることなく、すべてのPHP呼び出しをフックできるのです。
  </p>
  <p class="simpara">
   <code class="literal">mysqlnd</code> は wire protocol を実装しています。そのため、プラグインは通信プロトコルを解析し、リバースエンジニアリングし、管理できるばかりか、通信プロトコルを置き換えることだってできます。ただ、こんなことをする必要は通常ありません。
  </p>
  <p class="simpara">
   プラグインが 2つのレベル(C言語のAPI と wire protocol) を使って実装できるので、MySQL Proxy よりも大きな柔軟性を得られます。 <code class="literal">mysqlnd</code>プラグインが C言語のAPI を使って実装されれば、wire protocol に対していかなる変更が行われても、プラグインへの変更は必要ありません。
  </p>
 </div><?php manual_footer($setup); ?>