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.
Erweiterung | mysqlnd.query()-Zeiger | Aufrufstapel (Call Stack) bei Aufruf der Elternmethode |
---|---|---|
ext/mysqlnd | mysqlnd.query() | mysqlnd.query |
ext/mysqlnd_cache | mysqlnd_cache.query() |
|
ext/mysqlnd_monitor | mysqlnd_monitor.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.