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.
To Top