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