2024 日本 PHP 研討會

mysqlnd 外掛 API

以下是 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()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

ext/mysqlnd_monitor mysqlnd_monitor.query()
  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. mysqlnd.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/mysqlext/mysqliPDO_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_pluginext/mysqlnd_plugin 也會返回。

  • 無論應用程式使用了哪個 PHP MySQL 擴充功能,它都會收到與 127.0.0.1 的連線。PHP MySQL 擴充功能本身會返回到 PHP 應用程式。循環結束。

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top