The MySQL Native Driver プラグインAPI は MySQL Native Driver、略して mysqlnd
が持つ機能の一つです。mysqlnd
プラグインは、PHPアプリケーションと MySQL サーバの間にあるレイヤで動きます。これは MySQL Proxy と比較できます。MySQL Proxy はあらゆる MySQL クライアントアプリケーション、たとえば PHPアプリケーション と MySQL サーバの間のレイヤで動きます。mysqlnd
プラグインは典型的な MySQL Proxy のタスク、たとえばロードバランシングやモニタリング、パフォーマンスの最適化をこなせます。アーキテクチャや置かれる場所が異なるため、mysqlnd
プラグインは MySQL Proxy が持ついくつかの欠点がありません。たとえば、プラグインを使えば、単一障害点が存在しませんし、専用のプロキシサーバをデプロイする必要もありませんし、新しいプログラミング言語(Lua) を学ぶ必要もありません。
mysqlnd
プラグインは mysqlnd
の拡張と考えることができます。プラグインは 多くの mysqlnd
関数の制御を奪い取ることができます。mysqlnd
関数は ext/mysql
や ext/mysqli
、PDO_MYSQL
のような PHP の MySQLエクステンションによって呼び出されます。その結果として、mysqlnd
プラグイン はクライアントアプリケーションからこれらのエクステンションへの呼び出しの制御をすべて奪うことができるのです。
内部的な mysqlnd
関数の呼び出しも制御を奪ったり、処理を置き換えたりすることができます。mysqlnd
の内部的な関数テーブルを管理することに関しても全く制限がありません。ある mysqlnd
関数が mysqlnd
を使うエクステンションによって呼び出される場合に、適切な mysqlnd
プラグインの適切な関数に処理を転送するようにセットアップすることが可能です。このように、mysqlnd
の内部関数テーブルを管理できることで、プラグインの柔軟性が最大限に発揮できるのです。
mysqlnd
プラグインは、実際は mysqlnd
のプラグインAPI (これは MySQL Native Driver, 略して mysqlnd
に組み込まれています) を使い、C言語 で書かれた PHPエクステンション です。 プラグインは PHPアプリケーションに対して 100% 透過的です。つまり、プラグインがPHPアプリケーションとは異なるレイヤで動作するため、アプリケーションを変更する必要がないのです。mysqlnd
プラグイン は、mysqlnd
のひとつ下のレイヤで動くと考えることができます。
mysqlnd
プラグインで実現可能なアプリケーションのリストをいくつか以下に示します
ロードバランシング
読み取り/書き込み の分割。例として、PECL/mysqlnd_ms (Master Slave) が挙げられます。この エクステンション は 読み取り/書き込み のクエリをレプリケーションのセットアップ向けに分割します。
フェイルオーバー
ラウンドロビン, 負荷が一番低いサーバへの転送
サーバの監視
クエリのロギング
クエリの分析
クエリの監査。例として、PECL/mysqlnd_sip (SQL Injection Protection) が挙げられます。この エクステンション はクエリを調べ、ルールセットに従って許可されたクエリのみを実行します。
パフォーマンスの向上
キャッシュ。例として、PECL/mysqlnd_qc (Query Cache) が挙げられます。
トラフィックの調整
シャーディング。例として、PECL/mysqlnd_mc (Multi Connect) が挙げられます。このエクステンション は、SELECT ステートメントを SELECT ... LIMIT part1, SELECT LIMIT part_n という形でn個に分割します。そしてクエリを別々の MySQLサーバに送り、結果をクライアント側でマージします。
利用可能な MySQL Native Driverプラグイン
既にたくさんの mysqlnd プラグインが利用可能になっています。以下が含まれます。
PECL/mysqlnd_mc - 複数接続ができるプラグイン
PECL/mysqlnd_ms - マスタースレーブ構成用のプラグイン
PECL/mysqlnd_qc - クエリキャッシュプラグイン
PECL/mysqlnd_pscache - プリペアドステートメントハンドルをキャッシュするプラグイン
PECL/mysqlnd_sip - SQLインジェクションから防御するためのプラグイン
PECL/mysqlnd_uh - ユーザーハンドラープラグイン