## 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() | mysqlnd_cache.query() mysqlnd.query
ext/mysqlnd_monitor | mysqlnd_monitor.query() | mysqlnd_monitor.query() mysqlnd_cache.query() 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.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open