以下是 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 應用程式。循環結束。