以下是 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 应用程序。循环结束。