以下是 mysqlnd 外掛 API 中提供的函式列表
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()
沒有正式定義什麼是外掛以及外掛機制如何運作。
外掛機制中常見的組成部分有
外掛管理器
外掛 API
應用程式服務(或模組)
應用程式服務 API(或模組 API)
mysqlnd 外掛概念採用了這些功能,並且享有開放式架構。
無限制
插件可以完全存取 mysqlnd 的內部運作。沒有任何安全限制或約束。所有東西都可以被覆寫,以實現友善或惡意的演算法。建議您只部署來自受信任來源的插件。
如前所述,插件可以自由使用指標。這些指標不受任何限制,可以指向另一個插件的數據。可以使用簡單的偏移量運算來讀取另一個插件的數據。
建議您編寫協作式插件,並始終呼叫父方法。插件應始終與 mysqlnd 本身協作。
| 擴充功能 | mysqlnd.query() 指標 | 如果呼叫父方法,則呼叫堆疊 |
|---|---|---|
| ext/mysqlnd | mysqlnd.query() | mysqlnd.query |
| ext/mysqlnd_cache | mysqlnd_cache.query() |
|
| ext/mysqlnd_monitor | mysqlnd_monitor.query() |
|
在此情境中,載入了一個快取 (ext/mysqlnd_cache) 和一個監控 (ext/mysqlnd_monitor) 插件。兩者都繼承了 Connection::query()。插件註冊發生在 MINIT,使用先前顯示的邏輯。PHP 預設會按字母順序呼叫擴充功能。插件彼此之間並不知曉,也不會設定擴充功能依賴關係。
預設情況下,插件在其衍生的方法版本中呼叫 query 方法的父實作。
PHP 擴充功能回顧
這是使用範例插件 ext/mysqlnd_plugin 時會發生什麼情況的回顧,該插件將 mysqlnd C 插件 API 公開給 PHP
任何 PHP MySQL 應用程式都會嘗試建立與 192.168.2.29 的連線
PHP 應用程式將使用 ext/mysql、ext/mysqli 或 PDO_MYSQL。所有三個 PHP MySQL 擴充功能都使用 mysqlnd 建立與 192.168.2.29 的連線。
Mysqlnd 呼叫其 connect 方法,該方法已被 ext/mysqlnd_plugin 繼承。
ext/mysqlnd_plugin 呼叫使用者註冊的使用者空間鉤子 proxy::connect()。
使用者空間鉤子將連線主機 IP 從 192.168.2.29 更改為 127.0.0.1,並返回由 parent::connect() 建立的連線。
ext/mysqlnd_plugin 透過呼叫原始的 mysqlnd 方法來建立連線,執行等同於 parent::connect(127.0.0.1) 的操作。
ext/mysqlnd 建立連線並返回 ext/mysqlnd_plugin。ext/mysqlnd_plugin 也會返回。
無論應用程式使用了哪個 PHP MySQL 擴充功能,它都會收到與 127.0.0.1 的連線。PHP MySQL 擴充功能本身會返回到 PHP 應用程式。循環結束。