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 按字母顺序调用扩展。插件彼此之间不了解,也不设置扩展依赖关系。

默认情况下,插件在派生方法中调用查询方法的父实现。

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