MySQL Native Driver プラグインAPI
PHP Manual

mysqlnd のプラグインAPI

mysqlndプラグインAPI で提供されている関数のリストを以下に示します:

プラグインが何かとか、どのようにプラグインが機能するのか、という疑問に対する公式な定義はありません。

プラグインのメカニズムでよく見つかるコンポーネントは以下の通りです:

mysqlndプラグインのコンセプトにはこれらが取り入れられており、追加でオープンなアーキテクチャの恩恵を受けています。

mysqlnd の内部には無制限にアクセスできる

プラグインは mysqlnd の内部にすべてアクセスできます。セキュリティ上の限界や制限はありません。mysqlnd に親和性が高い、または不利なアルゴリズムを実装するためにすべてを置き換えることができます。よって、信頼できる配布元からのプラグインだけをデプロイすることを推奨します。

以前議論したとおり、プラグインはポインタを自由に使えます。これらのポインタはあらゆる点で制限されていないので、別のプラグインのデータを指すこともできます。簡単にオフセットを計算するだけで別のプラグインのデータを使うことができます。

mysqlnd と協調的なプラグインを書くこと、そして開発者はいつも親メソッドを呼び出すことを推奨します。プラグインはいつも mysqlnd と協調的であるべきです。

問題: 呼び出しの連鎖と協調の例
エクステンション mysqlnd.query() の関数ポインタ 親メソッドを呼んだ場合のコールスタック
ext/mysqlnd mysqlnd.query() mysqlnd.query
ext/mysqlnd_cache mysqlnd_cache.query()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

ext/mysqlnd_monitor mysqlnd_monitor.query()
  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. mysqlnd.query

このシナリオでは、キャッシュ(ext/mysqlnd_cache) と モニタ(ext/mysqlnd_monitor) プラグインが読み込まれています。両方とも Connection::query() を継承しています。プラグインの登録が 以前説明したロジックを使って MINIT(モジュール初期化) 時に発生します。PHP はエクステンションをデフォルトではアルファベット順に呼び出します。プラグインはお互いのことを知りませんし、エクステンションの依存性についても設定しません。

デフォルトで、プラグインは派生したメソッドの中で query メソッドの親クラスの実装を呼び出します。

PHP エクステンションの動きを再現する

サンプルのプラグイン ext/mysqlnd_plugin を使うと何が起こるかを以下で再現します。このプラグインは、mysqlnd の CプラグインAPI をPHPに公開しています。


MySQL Native Driver プラグインAPI
PHP Manual