Die Plugin-API von mysqlnd

Es folgt eine Liste der Funktionen, die in der Plugin-API von mysqlnd zur VerfĂŒgung stehen:

  • mysqlnd_plugin_register()
  • mysqlnd_plugin_count()
  • mysqlnd_plugin_get_plugin_connection_data()
  • mysqlnd_plugin_get_plugin_result_data()
  • mysqlnd_plugin_get_plugin_stmt_data()
  • mysqlnd_plugin_get_plugin_net_data()
  • mysqlnd_plugin_get_plugin_protocol_data()
  • mysqlnd_conn_get_methods()
  • mysqlnd_result_get_methods()
  • mysqlnd_result_meta_get_methods()
  • mysqlnd_stmt_get_methods()
  • mysqlnd_net_get_methods()
  • mysqlnd_protocol_get_methods()

Es gibt keine formale Definition dafĂŒr, was ein Plugin ist und wie ein Plugin-Mechanismus funktioniert.

Folgende Komponenten werden hÀufig in Plugin-Mechanismen verwendet:

  • Ein Plugin-Manager
  • Eine Plugin-API
  • Anwendungsdienste (oder Module)
  • Anwendungsdienst-APIs (oder Modul-APIs)

Das Plugin-Konzept von mysqlnd nutzt diese Merkmale und zeichnet sich zudem durch eine offene Architektur aus.

Keine EinschrÀnkungen

Ein Plugin hat uneingeschrĂ€nkten Zugriff auf die inneren AblĂ€ufe von mysqlnd. Es gibt keine SicherheitsbeschrĂ€nkungen oder EinschrĂ€nkungen. Alles kann ĂŒberschrieben werden, um nĂŒtzliche oder schĂ€dliche Algorithmen zu implementieren. Es wird empfohlen, nur Plugins aus einer vertrauenswĂŒrdigen Quelle einzusetzen.

Wie bereits erwÀhnt, können Plugins Zeiger beliebig verwenden. Diese Zeiger sind in keiner Weise eingeschrÀnkt und können auf die Daten eines anderen Plugins zeigen. Mit einer einfachen Offset-Berechnung können die Daten eines anderen Plugins gelesen werden.

Es wird empfohlen, kooperative Plugins zu schreiben und immer die Elternmethode aufzurufen. Die Plugins sollten immer mit mysqlnd selbst zusammenarbeiten.

Zum Thema: Ein Beispiel fĂŒr Verkettung und Kooperation
Erweiterung mysqlnd.query()-Zeiger Aufrufstapel (Call Stack) bei Aufruf der Elternmethode
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

In diesem Szenario werden ein Cache-Plugin (ext/mysqlnd_cache) und ein Überwachungs-Plugin (ext/mysqlnd_monitor) geladen. Beide sind Unterklassen von Connection::query(). Die Registrierung der Plugins erfolgt wĂ€hrend MINIT gemĂ€ĂŸ der zuvor gezeigten Logik. PHP ruft Erweiterungen standardmĂ€ĂŸig in alphabetischer Reihenfolge auf. Die Plugins wissen nichts voneinander und definieren keine AbhĂ€ngigkeiten von den Erweiterungen.

StandardmĂ€ĂŸig rufen die Plugins die ĂŒbergeordnete Implementierung der Abfragemethode in ihrer abgeleiteten Version der Methode auf.

Zusammenfassung des Verhaltens einer PHP-Erweiterung

Die folgende Zusammenfassung zeigt, was passiert, wenn das Beispiel-Plugin ext/mysqlnd_plugin verwendet wird, das die C-Plugin-API von mysqlnd fĂŒr PHP verfĂŒgbar macht:

  • Jede PHP-Anwendung, die MySQL verwendet, versucht, eine Verbindung zu 192.168.2.29 herzustellen
  • Die PHP-Anwendung verwendet entweder ext/mysql, ext/mysqli oder PDO_MYSQL. Alle drei PHP-MySQL-Erweiterungen verwenden mysqlnd, um die Verbindung zu 192.168.2.29 herzustellen.
  • Mysqlnd ruft seine Verbindungsmethode auf, die von ext/mysqlnd_plugin abgeleitet wurde.
  • ext/mysqlnd_plugin ruft den vom Benutzer registrierten Userspace-Hook, die Methode proxy::connect(), auf.
  • Dieser Userspace-Hook Ă€ndert die IP-Adresse des Hosts, zu dem eine Verbindung aufgebaut werden soll, von 192.168.2.29 auf 127.0.0.1 und gibt die von parent::connect() hergestellte Verbindung zurĂŒck.
  • ext/mysqlnd_plugin bewirkt dasselbe wie parent::connect(127.0.0.1), indem es die ursprĂŒngliche mysqlnd-Methode aufruft, um eine Verbindung herzustellen.
  • ext/mysqlnd stellt die Verbindung her und gibt sie an ext/mysqlnd_plugin zurĂŒck, das sie seinerseits zurĂŒckgibt.
  • UnabhĂ€ngig davon, welche PHP-MySQL-Erweiterung die Anwendung verwendet, erhĂ€lt sie eine Verbindung zu 127.0.0.1. Die PHP-MySQL-Erweiterung ĂŒbergibt die Kontrolle wieder an die PHP-Anwendung. Der Zyklus ist geschlossen.
add a note

User Contributed Notes

There are no user contributed notes for this page.