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.