以下是 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 按字母顺序调用扩展。插件彼此不知道,并且不设置扩展依赖项。
默认情况下,插件在其派生方法中调用查询方法的父实现。
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 应用程序。循环结束。